Получить значения атрибутов с пространством имен, используя Nokogiri - PullRequest
2 голосов
/ 16 декабря 2011

Я анализирую файл document.xml, используя Nokogiri, извлеченный из файла .docx, и мне нужно получить значения атрибутов с именами, например "w:val".

Это образец исходного XML:

<w:document>
  <w:body>
    <w:p w:rsidR="004D5F21" w:rsidRPr="00820E0B" w:rsidRDefault="00301D39" pcut:cut="true">
      <w:pPr>
        <w:jc w:val="center"/>
      </w:pPr>
  </w:body>
</w:document>

Это пример кода:

require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.search('//w:jc').each do |n|
    puts n['//w:val']
  end

В консоли ничего нет, только пустойлиний.Как я могу получить значения атрибутов?

Ответы [ 3 ]

3 голосов
/ 16 декабря 2011

В документе отсутствует декларация пространства имен, и Нокогири не доволен этим. Если вы проверите errors метод для вашего doc, вы увидите что-то вроде:

puts doc.errors
Namespace prefix w on document is not defined
Namespace prefix w on body is not defined
Namespace prefix w for rsidR on p is not defined
Namespace prefix w for rsidRPr on p is not defined
Namespace prefix w for rsidRDefault on p is not defined
Namespace prefix pcut for cut on p is not defined
Namespace prefix w on p is not defined
Namespace prefix w on pPr is not defined
Namespace prefix w for val on jc is not defined
Namespace prefix w on jc is not defined
Opening and ending tag mismatch: p line 3 and body
Opening and ending tag mismatch: body line 2 and document
Premature end of data in tag document line 1

Используя CSS-средства доступа Nokogiri вместо XPath, вы можете обойти проблемы с пространством имен:

puts doc.at('jc')['val']

выведет:

center

Если вам нужно выполнить итерацию по нескольким jc узлам, используйте search или один из его псевдонимов или методов, подобных действиям, аналогично тому, что вы делали раньше.

3 голосов
/ 16 декабря 2011
require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.xpath('//jc').each do |n|
    puts n.attr('val')
  end

Должно работать.Не забудьте посмотреть документы: http://nokogiri.org/tutorials/searching_a_xml_html_document.html#fn:1

0 голосов
/ 16 декабря 2011

Показать там:

require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.search('jc').each do |n|
  puts n['val']
end

Также, да, прочитайте это: http://nokogiri.org/tutorials/searching_a_xml_html_document.html#fn:1

...