Ruby XPath找到属性

时间:2009-02-20 23:35:20

标签: ruby xpath

可以使用哪个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

5 个答案:

答案 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')}"}