【问题标题】:XML parsing elements and element attributes into arrayXML将元素和元素属性解析成数组
【发布时间】:2015-02-06 07:02:10
【问题描述】:

我正在尝试将一些 XML 解析为一个数组。这是我正在解析的一部分 XML:

<Group_add>
  <Group org_pac_id="0000000001">
    <org_legal_name>NAME OF GROUP</org_legal_name>
    <par_status>Y</par_status>
    <Quality>
      <GPRO_status>N</GPRO_status>
      <ERX_status>N</ERX_status>
    </Quality>
    <Profile_Spec_list>
      <Spec>08</Spec>
    </Profile_Spec_list>
    <Location adrs_id="OR974772594SP2280XRDXX300">
      <other_tags>xx</other_tags>
    </Location>
  </Group>
  <Group org_pac_id="0000000002">
    ...
  </Group>

</Group_add>

我目前能够获取“组”的属性和“org_legal_name”中的文本,并使用下面的代码将它们添加到数组中。

def parse(input_file, output_array)
    puts "Parsing #{input_file} data. Please wait..."
    doc = Nokogiri::XML(File.read(input_file))
    doc.xpath("//Group").each do |group|
        ["org_legal_name"].each do |name|
            output_array << [group["org_pac_id"], group.at(name).inner_html]
        end
    end
end

我也想将位置“adrs_id”添加到 output_array,但似乎无法弄清楚那部分。

示例输出:

["0000000001", "NAME OF GROUP", "OR974772594SP2280XRDXX300"]
["0000000002", "NAME OF GROUP 2", "OR974772594SP2280XRDXX301"]

【问题讨论】:

  • 您需要展示您想要的输出示例。添加adrs_id 很容易。在不知道你想要什么的情况下添加它是很困难的。此外,您的 XML 可能过于简单。看起来您想要遍历多个组标签,包含多个“org_legal_name”标签,但 XML 没有显示。而且,在这种情况下,“组”不能是文档的根。

标签: ruby arrays xml nokogiri


【解决方案1】:

开始于:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <Group org_pac_id="0000000001">
          <org_legal_name>NAME OF GROUP</org_legal_name>
          <Location adrs_id="OR974772594SP2280XRDXX300">
              <other_tags>xx</other_tags>
          </Location>
  </Group>
</xml>
EOT

根据我将使用的 XML:

array = []
array << doc.at('org_legal_name').text
array << doc.at('Location')['adrs_id']
array # => ["NAME OF GROUP", "OR974772594SP2280XRDXX300"]

如果 XML 更复杂(我怀疑确实如此),那么我们需要一个准确的、最小的示例。


基于更新的 XML(这仍然是可疑的),这就是我要使用的。请注意,我删除了与问题无关的信息,以将 XML 减少到所需的最低限度:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <Group_add>
    <Group org_pac_id="0000000001">
      <org_legal_name>NAME OF GROUP</org_legal_name>
      <Location adrs_id="OR974772594SP2280XRDXX300">
        <other_tags>xx</other_tags>
      </Location>
    </Group>
    <Group org_pac_id="0000000002">
      <org_legal_name>NAME OF ANOTHER GROUP</org_legal_name>
      <Location adrs_id="OR974772594SP2280XRDXX301">
        <other_tags>xx</other_tags>
      </Location>
    </Group>
  </Group_add>
</xml>
EOT

data = doc.search('Group').map do |group|
  [
    group['org_pac_id'],
    group.at('org_legal_name').text,
    group.at('Location')['adrs_id']
  ]
end

结果:

data # => [["0000000001", "NAME OF GROUP", "OR974772594SP2280XRDXX300"], ["0000000002", "NAME OF ANOTHER GROUP", "OR974772594SP2280XRDXX301"]]

考虑将group 变量作为占位符传递到块中。从该节点可以轻松地向下查看 DOM,并获取仅适用于该特定节点的内容。

请注意,我使用的是 CSS 而不是 XPath 选择器。它们更容易阅读并且通常工作正常。有时我们需要 XPath 的附加功能,有时 Nokogiri 对 jQuery 的 CSS 访问器的使用为我们提供了有用的东西。

【讨论】:

  • 你是对的。我确实想遍历 。我已经更新了我的示例块以显示该组不是根。我还添加了我要使用的示例输出数组。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2011-01-11
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多