Ruby on rails Rails 3:解析XML时检测类型
我有一个以下格式的简单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 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])
编辑:除非散列值不是单独的列,例如,您正在序列化它们