【问题标题】:Accessing child XML elements iteratively with Ruby and Nokogiri使用 Ruby 和 Nokogiri 迭代访问子 XML 元素
【发布时间】:2012-07-12 17:23:13
【问题描述】:

我有一个类似这样的 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 循环访问每个“公司”并获得“名称”和“位置”属性就好了。但是,我不知道该怎么做是访问每个“公司”的“员工”信息。

我确定我遗漏了一些简单的东西,但我一直在窥探,我似乎无法揭开它的神秘面纱。 非常感谢提供帮助。

【问题讨论】:

  • 请发布您的代码以获取名称和位置。由于 Nokogiri 有很多方法可以做事,我可以尝试根据您选择使用的方法调整我的答案。
  • 请同时修复您的 xml。 Name 类型缺少右引号,并且缺少 EmployeeCompanies 结束标记。 Nokogiri 的默认解析模式不会报错,但您会得到错误的数据。

标签: ruby nokogiri


【解决方案1】:

注意:我强烈建议在开发时传递 args (raw_xml_string, 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'

【讨论】:

    【解决方案2】:

    您的 XML 格式不正确。

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

    doc = Nokogiri::XML(xml)
    puts doc.errors
    

    输出:

    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>
    

    另外,&lt;/Employees&gt; 的结束标签在这两种情况下都缺失,但 Nokogiri 会修复这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多