2017-05-08 3 views
0

I ont un fichier XML comme:Comment récupérer les attributs de 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> 

Je veux saisir tous les attributs du fichier. Je peux obtenir @doc.at('fileHeader')['vendorName'] mais je n'obtiens pas le résultat attendu ONRM_ROOT_MO_R pour la deuxième déclaration puts.

Voici mon code 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'] 

La sortie est:

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

Merci d'avoir apporté les modifications nécessaires pour clarifier le problème. – ssharma

+0

Il n'est pas nécessaire de nous remercier. En outre, les commentaires ne sont pas pour remercier les gens. Upvotes et sélection des réponses le font. Voir le dernier paragraphe dans http://stackoverflow.com/help/someone-answers. –

Répondre

-1

Votre document a namespaces, vous devez prendre les compte, plus votre sélecteur était erroné:

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, comme search essaie de savoir si vous êtes en utilisant un sélecteur CSS ou XPath. Votre sélecteur ne possédait pas les affectations XPath normales, donc il supposait que vous vouliez dire CSS, mais l'espace de noms n'était pas délimité correctement pour CSS, qui utilise |. Cependant, cela n'est pas correct pour XPath, car vous deviez indiquer à Nokogiri où chercher dans le document. // signifie « chercher partout » dans XPath-ese et permettrait Nokogiri de déterminer qu'il doit utiliser XPath: tutoriel

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

« Namespaces » documentation dans la section « Recherche d'un document XML/HTML » Lisons Nokogiri, à la fin de la page, avec la documentation collect_namespaces.

+0

Merci pour une bonne explication. – ssharma