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

使用Ruby和Nokogiri迭代访问子XML元素,ruby,nokogiri,Ruby,Nokogiri,我有一个类似以下内容的XML文件: <Companies type="Container"> <Company type="Category"> <Name type="Property">Company 123</Name> <Location type="Property">New York</Location> <Employees type="Container">

我有一个类似以下内容的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>
我必须浏览这个文件,把所有的信息都拿出来,这样我才能使用它。我可以使用Nokogiri循环访问每个“公司”,并获得“名称”和“位置”属性。但是,我不知道如何访问每个“公司”的“员工”信息


我肯定我遗漏了一些简单的东西,但我一直在pry内部挖掘,我似乎无法解开这个谜团。非常感谢您的帮助。

注意:我强烈建议在开发时传递args raw_xml_字符串,nil,nil,Nokogiri::xml::ParseOptions::STRICT,以捕获格式错误的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]
  }
}

使用/或%方法时需要注意的一点是,它们将选择任何子代,而不仅仅是直接子代。这就是为什么我使用“./Name”而不仅仅是“Name”。

注意:我强烈建议在开发时传递args raw_xml_字符串nil,nil,Nokogiri::xml::ParseOptions::STRICT来捕获格式错误的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]
  }
}
使用/或%方法时需要注意的一点是,它们将选择任何子代,而不仅仅是直接子代。这就是我使用“./Name”而不是“Name”的原因。

您的XML格式不正确

Nokogiri可以使用errors方法帮助您找出问题所在。解析XML并检查错误:

产出:

Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 4
Opening and ending tag mismatch: Company line 3 and Name
Opening and ending tag mismatch: Employees line 6 and Company
Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 17
Opening and ending tag mismatch: Company line 16 and Name
Opening and ending tag mismatch: Employees line 19 and Company
Nokogiri将尝试修复XML,但有些事情无法正确完成。修复缺少的引号是其中之一:

<Name type="Property>Company 123</Name>
<Name type="Property>Company ABC</Name>
你错了。它们应该是:

<Name type="Property">Company 123</Name>
<Name type="Property">Company ABC</Name>
另外,在这两种情况下都缺少的结束标记,但Nokogiri将修复这些标记。

您的XML格式不正确

Nokogiri可以使用errors方法帮助您找出问题所在。解析XML并检查错误:

产出:

Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 4
Opening and ending tag mismatch: Company line 3 and Name
Opening and ending tag mismatch: Employees line 6 and Company
Unescaped '<' not allowed in attributes values
attributes construct error
Couldn't find end of Start Tag Name line 17
Opening and ending tag mismatch: Company line 16 and Name
Opening and ending tag mismatch: Employees line 19 and Company
Nokogiri将尝试修复XML,但有些事情无法正确完成。修复缺少的引号是其中之一:

<Name type="Property>Company 123</Name>
<Name type="Property>Company ABC</Name>
你错了。它们应该是:

<Name type="Property">Company 123</Name>
<Name type="Property">Company ABC</Name>

此外,两种情况下的结束标记都丢失,但Nokogiri将修复这些标记。

请发布获取名称和位置的代码。由于使用Nokogiri有很多方法,我可以尝试根据您选择的方法定制我的答案。请同时修复您的xml。名称类型缺少结束引号,并且缺少员工和公司结束标记。Nokogiri的默认解析模式没有问题,但您将返回错误的数据。请发布获取名称和位置的代码。由于使用Nokogiri有很多方法,我可以尝试根据您选择的方法定制我的答案。请同时修复您的xml。名称类型缺少结束引号,并且缺少员工和公司结束标记。Nokogiri的默认解析模式没有任何问题,但您将返回错误的数据。