2011-12-16 80 views
2

我使用Nokogiri解析document.xml文件,该文件是从.docx文件提取的,需要获取名称属性值,如“w:val”。使用Nokogiri获取属性的值使用Nokogiri

这是源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

文件丢失它的命名空间声明,并引入nokogiri不对此感到满意。如果您检查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 

利用引入nokogiri的CSS存取,而不是XPath的,你可以围绕命名空间的问题步骤:

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

将输出:

center 

如果您需要遍历多个jc节点上,使用search或其aliase之一类似于你之前的做法。