可以使用哪个Ruby库来使用XPath选择 attribute ,并将其用作其他XPath查询的起点。
示例:
<root>
<add key="A" value="B" />
<add key="C" value="D" />
<add foo="E" bar="F" />
</root>
所需代码:
get_pair "//*/@key", "../@value"
get_pair "//*/@foo", "../@bar"
预期产出:
"A" "B"
"C" "D"
"E" "F"
伪实现:
def get_pair(key, value)
xml_doc.select[key].each do |a|
puts [a, a.select[value]]
end
end
答案 0 :(得分:4)
您的出发点是REXML
这里的“挑战”是如何将属性节点视为子节点,这可以通过使用singleton methods来完成,然后其他一切自然地遵循:
require "rexml/document"
include REXML # so that we don't have to prefix everything with REXML::...
def get_pair(xml_doc, key, value)
XPath.each(xml_doc, key) do |node|
if node.is_a?(Attribute)
def node.parent
self.element
end
end
puts "\"#{node}\" \"#{XPath.first(node, value)}\""
end
end
xml_doc = Document.new <<EOF
<root>
<add key="A" value="B" />
<add key="C" value="D" />
<add foo="E" bar="F" />
</root>
EOF
get_pair xml_doc, "//*/@key", "../@value"
get_pair xml_doc, "//*/@foo", "../@bar"
产生
"A" "B"
"C" "D"
"E" "F"
答案 1 :(得分:3)
显然Nokogiri是最快的Ruby XML解析器
请参阅http://www.rubyinside.com/nokogiri-ruby-html-parser-and-xml-parser-1288.html
今天正在使用它,它很棒。
对于你的例子:
doc = Nokogiri::XML(your_xml)
doc.xpath("/root/add").map do |add|
puts [add['key'], add['value']]
end
编辑:不出所料,Nokogiri声称更快的说法并非毫无争议。
但是,我们发现它在我们的生产环境中比libxml更稳定(libxml偶尔会崩溃;只是在Nokogiri交换已经解决了这个问题)
答案 2 :(得分:1)
如果您要在性能重要的任何区域解析大量数据,那么您将需要libxml-ruby。 REXML和Hpricot都不错,但我最近不得不在我自己的服务器上进行一些解析,因为它的速度提高了大约1200%。
答案 3 :(得分:0)
我还建议看看Hpricot ......它是一个非常富有表现力的HTML和XML解析库,受jQuery的启发。
答案 4 :(得分:0)
rexml,随ruby一起提供你想要的东西:
require 'rexml/document'
include REXML
xml = Document.new('<root><add key="A" value="B" /><add key="C" value="D" /><add foo="E" bar="F" /></root>')
xml.root.each_element_with_attribute('key'){|e| puts "#{e.attribute('key')} #{e.attribute('value')}"}