Ruby XPath для поиска атрибута - PullRequest
2 голосов
/ 21 февраля 2009

Какую библиотеку Ruby можно использовать для выбора атрибута с использованием XPath и использования его в качестве отправной точки для других запросов 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 ]

4 голосов
/ 21 февраля 2009

Ваша отправная точка будет REXML

Здесь «проблема» заключается в том, как трактовать узел атрибута как дочерний узел, и это можно сделать с помощью одноэлементных методов , тогда все остальное следует естественным образом:

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"
3 голосов
/ 21 февраля 2009

Очевидно, 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

Редактировать :. Это не удивительно получается outthat утверждения, что Nokogiri является быстрее не бесспорным

Однако мы обнаружили, что он более стабилен, чем libxml, в нашей производственной среде (иногда происходил сбой libxml; просто замена в Nokogiri решила проблему)

1 голос
/ 21 февраля 2009

И если вы будете анализировать приличный объем данных в любой области, где важна производительность, вам потребуется libxml-ruby . REXML и Hpricot хороши, но недавно мне пришлось переключиться на моем собственном сервере для анализа, потому что он был примерно на 1200% быстрее.

0 голосов
/ 21 февраля 2009

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')}"}
0 голосов
/ 21 февраля 2009

Я бы также предложил взглянуть на Hpricot ... это очень выразительная библиотека для разбора HTML и XML, вдохновленная jQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...