使用Ruby和Nokogiri迭代访问子XML元素

n8g*_*ard 1 ruby nokogiri

我有一个类似于这样的XML文件:

<Companies type="Container">
<Company type="Category">
    <Name type="Property">Company 123</Name>
    <Location type="Property">New York</Location>
    <Employees type="Container">
        <Employee type="Reference">
            <Name type="Property">John Smith</Name>
            <Email type="Property">john@company.123</Email>
        </Employee>
        <Employee type="Reference">
            <Name type="Property">Jane Doe</Name>
            <Email type="Property">jane@company.123</Email>
        </Employee>
</Company>
<Company type="Category">
    <Name type="Property">Company ABC</Name>
    <Location type="Property">Minneapolis</Location>
    <Employees type="Container">
        <Employee type="Reference">
            <Name type="Property">John Doe</Name>
            <Email type="Property">doe@company.abc</Email>
        </Employee>
        <Employee type="Reference">
            <Name type="Property">Jane Smith</Name>
            <Email type="Property">smith@company.abc</Email>
        </Employee>
</Company>
Run Code Online (Sandbox Code Playgroud)

我必须浏览此文件并获取所有信息,以便我可以使用它.我可以使用Nokogiri循环访问每个"公司"并获得"名称"和"位置"属性.但是,我无法弄清楚该怎么做才能访问每个"公司"的"员工"信息.

我确信我错过了一些简单的东西,但我一直在挖掘内窥探我似乎无法揭开它的神秘面纱.非常感谢帮助.

Kel*_*vin 8

注意:我强烈建议(raw_xml_string, nil, nil, Nokogiri::XML::ParseOptions::STRICT)在开发时传递args 以捕获格式错误的xml.

xdoc = Nokogiri.XML(raw_xml_string)

( xdoc/'/Companies/Company' ).each {|com|
  puts "company:"
  p [(com/'./Name').text, (com/'./Location').text]

  puts "employees:"
  # you need another loop to grab the employees.
  (com/'Employees/Employee').each {|emp|
    p [(emp/'./Name').text, (emp/'./Email').text]
  }
}
Run Code Online (Sandbox Code Playgroud)

当你使用/%方法时要注意的一点是,他们会选择任何后代,而不仅仅是直接的孩子.这就是为什么我用'./Name'而不是仅仅'Name'.