2011-12-16 30 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之一類似於你之前的做法。