Ruby 如何强制将XML节点解析为哈希数组?

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

这是我的简化myXML:

<?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解析器了。