Ruby 如何强制将XML节点解析为哈希数组?
这是我的简化myXML:Ruby 如何强制将XML节点解析为哈希数组?,ruby,arrays,hash,xml-parsing,Ruby,Arrays,Hash,Xml Parsing,这是我的简化myXML: <?xml version="1.0" encoding="utf-8"?> <ShipmentRequest> <Message> <MemberId>A00000001</MemberId> <MemberName>Bruce</MemberName> <Line> <LineNumber>3.1</Lin
<?xml version="1.0" encoding="utf-8"?>
<ShipmentRequest>
<Message>
<MemberId>A00000001</MemberId>
<MemberName>Bruce</MemberName>
<Line>
<LineNumber>3.1</LineNumber>
<Item>fruit-004</Item>
<Description>Peach</Description>
</Line>
<Line>
<LineNumber>4.1</LineNumber>
<Item>fruit-001</Item>
<Description>Peach</Description>
</Line>
</Message>
</ShipmentRequest>
Crack gem将哈希行
创建为一个数组,因为myXML中有两个
节点。但是,如果myXML只包含一个
节点,Crack gem将不会将其解析为数组:
{
"MemberId"=>"ABC0001",
"MemberName"=>"Alan",
"Line"=> {"LineNumber"=>"4.1", "Item"=>"fruit-004", "Description"=>"Apple"}
}
我想将其视为一个数组,无论是否只有一个节点:
{
"MemberId"=>"ABC0001",
"MemberName"=>"Alan",
"Line"=> [{"LineNumber"=>"4.1", "Item"=>"fruit-004", "Description"=>"Apple"}]
}
将XML文档转换为哈希后,可以执行以下操作:
myHash[“Line”]=[myHash[“Line”]]如果myHash[“Line”].种类?(Hash)
它将确保
行
节点将被包装在数组中。将XML文档转换为哈希后,可以执行以下操作:
myHash[“Line”]=[myHash[“Line”]]如果myHash[“Line”].种类?(Hash)
它将确保
行
节点将被包装在数组中。问题是,您依赖代码来完成真正应该做的事情。Crack不知道您希望单个节点是单个元素的数组,这种行为使您在尝试深入研究该部分数据时更加困难
解析XML并不难,而且,通过自己解析它,您将知道会发生什么,并且将避免处理Crack返回的“有时是数组,有时不是”的麻烦
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="utf-8"?>
<ShipmentRequest>
<Message>
<MemberId>A00000001</MemberId>
<MemberName>Bruce</MemberName>
<Line>
<LineNumber>3.1</LineNumber>
<Item>fruit-004</Item>
<Description>Peach</Description>
</Line>
<Line>
<LineNumber>4.1</LineNumber>
<Item>fruit-001</Item>
<Description>Peach</Description>
</Line>
</Message>
</ShipmentRequest>
EOT
message=doc.at('message')
查找第一个
节点message.at('MemberId')。text
查找
中的第一个
节点message.at('MemberName')。文本与上述步骤类似
message.search('Line')
查找
中的所有
节点hash
看起来像:
{:member_id=>"A00000001",
:member_name=>"Bruce",
:lines=>
[{:line_number=>"3.1", :item=>"fruit-004", :description=>"Peach"},
{:line_number=>"4.1", :item=>"fruit-001", :description=>"Peach"}]}
如果我从XML中删除一个
块,然后重新运行,我会得到:
{:member_id=>"A00000001",
:member_name=>"Bruce",
:lines=>[{:line_number=>"3.1", :item=>"fruit-004", :description=>"Peach"}]}
使用search
查找
节点是一个技巧search
返回一个节点集,它类似于一个数组,因此通过使用map
对其进行迭代,它将返回
标记内容的哈希数组
是解析HTML和XML的好工具,然后允许我们搜索、添加、更改或删除节点。它支持CSS和XPath访问器,因此,如果您习惯于jQuery或CSS的工作方式,或者XPath表达式,那么您将可以快速启动并运行。Nokogiri的教程是学习其工作原理的良好起点。问题是,您依赖代码来完成真正应该做的事情。Crack不知道您希望单个节点是单个元素的数组,这种行为使您在尝试深入研究该部分数据时更加困难 解析XML并不难,而且,通过自己解析它,您将知道会发生什么,并且将避免处理Crack返回的“有时是数组,有时不是”的麻烦
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<?xml version="1.0" encoding="utf-8"?>
<ShipmentRequest>
<Message>
<MemberId>A00000001</MemberId>
<MemberName>Bruce</MemberName>
<Line>
<LineNumber>3.1</LineNumber>
<Item>fruit-004</Item>
<Description>Peach</Description>
</Line>
<Line>
<LineNumber>4.1</LineNumber>
<Item>fruit-001</Item>
<Description>Peach</Description>
</Line>
</Message>
</ShipmentRequest>
EOT
message=doc.at('message')
查找第一个
节点message.at('MemberId')。text
查找
中的第一个
节点message.at('MemberName')。文本与上述步骤类似
message.search('Line')
查找
中的所有
节点hash
看起来像:
{:member_id=>"A00000001",
:member_name=>"Bruce",
:lines=>
[{:line_number=>"3.1", :item=>"fruit-004", :description=>"Peach"},
{:line_number=>"4.1", :item=>"fruit-001", :description=>"Peach"}]}
如果我从XML中删除一个
块,然后重新运行,我会得到:
{:member_id=>"A00000001",
:member_name=>"Bruce",
:lines=>[{:line_number=>"3.1", :item=>"fruit-004", :description=>"Peach"}]}
使用search
查找
节点是一个技巧search
返回一个节点集,它类似于一个数组,因此通过使用map
对其进行迭代,它将返回
标记内容的哈希数组
是解析HTML和XML的好工具,然后允许我们搜索、添加、更改或删除节点。它支持CSS和XPath访问器,因此,如果您习惯于jQuery或CSS的工作方式,或者XPath表达式,那么您将可以快速启动并运行。Nokogiri的教程是学习其工作原理的良好起点。Hi@The Tin Man!谢谢你的意见。我对这些东西真的很陌生,但我有一个印象,当我只是将XML文件转换成散列文件时,Crack gem非常方便,特别是,很容易导入MongoDB。在将它们转换之后,我可以通过查看一些需要作为数组的节点来对其进行润色。:)Crack使用非常简单的XML/JSON非常方便,但是数据集越大,提取数据就越困难。学会直接使用Nokogiri做这些事情,你就再也看不到另一个XML解析器了!谢谢你的意见。我对这些东西真的很陌生,但我有一个印象,当我只是将XML文件转换成散列文件时,Crack gem非常方便,特别是,很容易导入MongoDB。在将它们转换之后,我可以通过查看一些需要作为数组的节点来对其进行润色。:)Crack使用非常简单的XML/JSON非常方便,但是数据集越大,提取数据就越困难。学会直接使用Nokogiri做这些事情,你就再也看不到另一个XML解析器了。