我正在使用Nokogiri解析document.xml文件,从.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
控制台中没有任何内容,只有空行。如何获取属性的值?
答案 0 :(得分:3)
require 'nokogiri'
doc = Nokogiri::XML(File.open(path))
doc.xpath('//jc').each do |n|
puts n.attr('val')
end
应该有效。不要忘记查看文档:{{3}}
答案 1 :(得分:3)
该文档缺少其名称空间声明,Nokogiri对此不满意。如果您检查errors
的{{1}}方法,则会看到以下内容:
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
通过使用Nokogiri的CSS访问器而不是XPath,您可以绕过名称空间问题:
doc
将输出:
puts doc.at('jc')['val']
如果您需要迭代多个center
节点,请使用jc
或其中一个别名或类似行为的方法,类似于之前的操作。
答案 2 :(得分:0)
显示那里:
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