從XML

2017-05-08 13 views
0

如何獲取屬性,我有這樣一個XML文件:從XML

<?xml version="1.0" encoding="UTF-8"?> 
<bulkCmConfigDataFile xmlns:es="EricssonSpecificAttributes.17.08.xsd" 
xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" 
xmlns:gn="geranNrm.xsd" xmlns="configData.xsd"> 
<fileHeader fileFormatVersion="32.615 V4.5" vendorName="Ericsson"/> 
<configData dnPrefix="Undefined"> 
    <xn:SubNetwork id="ONRM_ROOT_MO_R"> 
     <xn:SubNetwork id="MKT_9364"> 
      <xn:MeContext id="936426_SEYMOUR"> 
      </xn:MeContext> 
     </xn:SubNetwork> 
    </xn:SubNetwork> 
</configData> 
<fileFooter dateTime="2017-05-08T10:15:53Z"/> 
</bulkCmConfigDataFile> 

我想抓住一切從文件的屬性。我可以得到@doc.at('fileHeader')['vendorName'],但我沒有得到第二個puts聲明的預期結果ONRM_ROOT_MO_R

這裏是我的Ruby代碼:

#!/usr/bin/env ruby 

require 'xmlsimple' 
require 'nokogiri' 
require 'ap' 


@doc = Nokogiri::XML(File.open("seymour.xml")) 
puts @doc.at('fileHeader')['vendorName'] 
puts @doc.at('xn:SubNetwork')['id'] 

輸出是:

Ericsson 
./bulk_cm_parse.rb:10:in `<main>': undefined method `[]' for nil:NilClass 
(NoMethodError) 
+0

感謝您的編輯,使問題更加清晰。 – ssharma

+0

沒有必要感謝我們。此外,評論並不是爲了感謝人們。 upvotes和選擇答案做到這一點。請參閱http://stackoverflow.com/help/someone-answers中的最後一段。 –

回答

-1

您的文檔具有命名空間,所以你必須把這些考慮進去,再加上你的選擇是錯誤的:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<?xml version="1.0" encoding="UTF-8"?> 
<bulkCmConfigDataFile xmlns:es="EricssonSpecificAttributes.17.08.xsd" 
xmlns:un="utranNrm.xsd" xmlns:xn="genericNrm.xsd" 
xmlns:gn="geranNrm.xsd" xmlns="configData.xsd"> 
<fileHeader fileFormatVersion="32.615 V4.5" vendorName="Ericsson"/> 
<configData dnPrefix="Undefined"> 
    <xn:SubNetwork id="ONRM_ROOT_MO_R"> 
     <xn:SubNetwork id="MKT_9364"> 
      <xn:MeContext id="936426_SEYMOUR"> 
      </xn:MeContext> 
     </xn:SubNetwork> 
    </xn:SubNetwork> 
</configData> 
<fileFooter dateTime="2017-05-08T10:15:53Z"/> 
</bulkCmConfigDataFile> 
EOT 

namespaces = doc.collect_namespaces 
doc.at('xn|SubNetwork', namespaces)['id'] # => "ONRM_ROOT_MO_R" 

at,像search試圖找出你是否使用CSS選擇器或XPath。您的選擇器沒有正常的XPath專用標記,因此它認爲您的意思是CSS,但是名稱空間沒有正確分隔CSS,它使用|

xn:SubNetwork對XPath不正確,因爲您需要告訴Nokogiri在文檔中的何處。 //意味着「搜索無處不在」的XPath的ESE並允許引入nokogiri以決定應使用XPath:在「搜索一個XML/HTML文檔」教程

doc.at('//xn:SubNetwork', namespaces)['id'] # => "ONRM_ROOT_MO_R" 

閱讀引入nokogiri的「Namespaces」的文件,在2002年底該頁面以及collect_namespaces文檔。

+0

感謝您的好解釋。 – ssharma