2017-05-08 7 views
0

Ich habe eine XML-Datei wie:Wie holen Attribute von 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> 

Ich möchte alle Attribute aus der Datei packen. Ich kann @doc.at('fileHeader')['vendorName'] bekommen, aber ich bekomme nicht das erwartete Ergebnis ONRM_ROOT_MO_R für die zweite puts Aussage.

Hier ist mein Ruby-Code:

#!/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'] 

Die Ausgabe lautet:

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

Danke für die Bearbeitung, um das Problem klarer zu machen. – ssharma

+0

Es ist nicht notwendig, uns zu danken. Kommentare dienen nicht dazu, Menschen zu danken. Upvotes und die Auswahl von Antworten tun das. Siehe den letzten Absatz in http://stackoverflow.com/help/someone-answers. –

Antwort

-1

Ihr Dokument Namespaces hat, so dass Sie diese Rechnung zu tragen, plus Ihre Wähler falsch war:

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, wie search versucht herauszufinden, ob Sie sind Verwenden eines CSS-Selektors oder XPath. Dein Selektor hatte nicht die normalen XPath-Zeichen, also nahm man an, du meintest CSS, aber dann wurde der Namespace für CSS, das | verwendet, nicht richtig abgegrenzt.

xn:SubNetwork ist nicht korrekt für XPath, obwohl Sie Nokogiri sagen müssen, wo Sie im Dokument nachsehen müssen. // bedeutet in XPath-ese "überall suchen" und würde es ermöglichen Nokogiri es XPath zu bestimmen, soll verwenden:

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

lesen Nokogiri der "Namespaces" Dokumentation in den "Suche eines XML/HTML-Dokument" Tutorial zu Ende die Seite, zusammen mit der collect_namespaces Dokumentation.

+0

Danke für die nette Erklärung. – ssharma