1

我有一个与此类似的 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 中挖掘,我似乎无法揭开它的神秘面纱。帮助将不胜感激。

4

2 回答 2

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]
  }
}

/使用or方法时要注意的一件事%是,它们将选择任何后代,而不仅仅是直接孩子。这就是为什么我使用'./Name'而不是仅仅使用'Name'.

于 2012-07-12T18:17:32.300 回答
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>

此外,在这两种情况下都缺少结束标签,</Employees>但 Nokogiri 会解决这些问题。

于 2012-07-12T19:21:58.207 回答