Ruby on rails Rails 3:解析XML时检测类型

Ruby on rails Rails 3:解析XML时检测类型,ruby-on-rails,ruby,xml,ruby-on-rails-3,Ruby On Rails,Ruby,Xml,Ruby On Rails 3,我有一个以下格式的简单XML文档: <?xml version="1.0" encoding="utf-8"?> <object> <strField>Foo</strField> <intField>1</intField> <dateField>2010-11-03</dateField> <boolField>true</boolField> <

我有一个以下格式的简单XML文档:

<?xml version="1.0" encoding="utf-8"?>
<object>
  <strField>Foo</strField>
  <intField>1</intField>
  <dateField>2010-11-03</dateField>
  <boolField>true</boolField>
  <nilField></nilField>
</object>
遗憾的是,XML中没有“type”属性,所以使用Hash.fromXML只是将每个字段解析为字符串。我要找的是某种字段类型的自动检测。我也看过Nokogiri,但它不能作为散列输出

实现这一目标最简单、最有效的方法是什么


非常感谢。

XML不一定有节点中值类型的指示符。在获取数据之前,您应该知道这一点,或者您的解析代码是。输出XML或电子表格的数据库通常知道数据的类型,它们会尝试为您提供数据的一些定义,但无法保证它们所称的固定数字与Ruby所称的一致。因此,您仍然需要进行某种属性匹配/映射,以了解它们发送给您的内容

如果您有一个散列,那么编写代码来遍历它并将值转换为您期望的类型,或者在使用这些值时执行这些操作就不会太难了


我总是使用Nokogiri直接解析XML,然后在处理节点时设置值类型

XML不一定有节点中值类型的指示符。在获取数据之前,您应该知道这一点,或者您的解析代码是。输出XML或电子表格的数据库通常知道数据的类型,它们会尝试为您提供数据的一些定义,但无法保证它们所称的固定数字与Ruby所称的一致。因此,您仍然需要进行某种属性匹配/映射,以了解它们发送给您的内容

如果您有一个散列,那么编写代码来遍历它并将值转换为您期望的类型,或者在使用这些值时执行这些操作就不会太难了


我总是使用Nokogiri直接解析XML,然后在处理节点时设置值类型

将其指定为XML中的属性:

<intField type="integer">101</intField>

没有什么神奇的方法可以做到这一点。您可以尝试分析字符串中的内容,但可以很容易地得到一个“1/2/1234”字符串,它看起来像一个日期,但应该是一个字符串。

或者将其指定为XML中的一个属性:

<intField type="integer">101</intField>

没有什么神奇的方法可以做到这一点。您可以尝试分析字符串中的内容,但是您可以很容易地得到一个“1/2/1234”字符串,它看起来像一个日期,但应该是一个字符串。

正确的处理方法是构建一个小型pull解析器。这是错误的方法:-)

#假定xml包含xml

def castValue(node)
  puts "Got #{node.name} with content #{node.content}"
  case node.name
  when "strField"
    return node.content
  when "intField"
    return node.content.to_i
  when "dateField"
    return Date.parse(node.content)
  when "boolField"
    case node.content
    when "true"
      return true
    else
      return false
    end
  when "nilField"
    return nil
  end
end


def to_hash xmlstring
  h = {}
  Nokogiri::XML.parse(xmlstring).root.children.each do |node|
    next if node.name == 'text'
    h[node.name] = castValue(node)
  end
  return h
end

从这里开始,您只需调用“h=to_hash myXMLstring”来获取哈希值。

正确的处理方法是构建一个小型pull解析器。这是错误的方法:-)

#假定xml包含xml

def castValue(node)
  puts "Got #{node.name} with content #{node.content}"
  case node.name
  when "strField"
    return node.content
  when "intField"
    return node.content.to_i
  when "dateField"
    return Date.parse(node.content)
  when "boolField"
    case node.content
    when "true"
      return true
    else
      return false
    end
  when "nilField"
    return nil
  end
end


def to_hash xmlstring
  h = {}
  Nokogiri::XML.parse(xmlstring).root.children.each do |node|
    next if node.name == 'text'
    h[node.name] = castValue(node)
  end
  return h
end

从那里,您只需调用“h=to_hash myXMLstring”来获取散列。

Rails将在保存模型之前自动将字符串转换为正确的类型。像这样做:
ModelName.create(params[:model\u name])


编辑:除非散列值不是单独的列,例如,您正在序列化它们。

Rails将在保存模型之前自动将字符串转换为正确的类型。像这样做:
ModelName.create(params[:model\u name])

编辑:除非散列值不是单独的列,例如,您正在序列化它们