我有一个类似的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循环浏览和访问每个"公司",并获得"名称"one_answers"位置"属性。然而,我不知道如何访问每个"公司"的"员工"信息。
我确信我错过了一些简单的东西,但我一直在窥探,我似乎无法解开这个谜。非常感谢您的帮助。
注意:我强烈建议在开发时传递参数(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'
。
您的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会修复这些标记。