2017-07-19 1 views
0

ce que je veux obtenir de dessous le fichier xml est: si le nombre de <broader> nœuds à l'intérieur <term> noeud> 1 ET une de la valeur de ces nœuds <broader> est égale à la valeur du noeud <id> ALORS affiche le texte du noeud <value>.Python/nombre XML de nœuds enfants

  <results> 
      <term> 
       <altLabel> 
        <value>Label1</value> 
       </altLabel> 
       <broader>11</broader> 
       <id>1</id> 
      </term> 
      <term> 
       <altLabel> 
        <value>Label2</value> 
       </altLabel> 
       <broader>22</broader> 
       <broader>2</broader> 
       <id>2</id> 
      </term> 
      <term> 
       <altLabel> 
        <value>Label3</value> 
       </altLabel> 
       <broader>3</broader> 
       <broader>33</broader> 
       <id>3</id> 
      </term> 
      <term> 
       <altLabel> 
        <value>Label4</value> 
       </altLabel> 
       <broader>44</broader> 
       <broader>44</broader> 
       <id>4</id> 
      </term> 
     </results> 

Alors que XML ci-dessus je suppose que pour obtenir:

Label2 
Label3 

REMARQUE: nombre de nœuds enfants à l'intérieur <term> nœud peut varier. Ceci est juste un exemple de XML, de sorte que je ne suis pas intéressé à pointer sur un élément spécifique de la table.

+1

Pourquoi «Label4» ne fait-il pas partie de vos résultats attendus? –

+0

car non du noeud Label4 'plus large' = Label4 'id'. –

Répondre

0

en utilisant builtin xml module, la sytax est assez similaire à beautifulsoup :)

Remplacer path_to_xml à votre chemin d'accès xml

from xml.etree import cElementTree as ET 
xml_dat = ET.parse(path_to_xml).getroot() 
for term in xml_dat.iter('term'): 
    broaders = term.findall('broader') 
    if len(broaders) > 1: 
     for broader in broaders: 
      if term.find('id').text == broader.text: 
       print(term.find('altLabel').find('value').text) 
0

Qu'est-ce que vous pouvez faire, en utilisant BeautifulSoup est en boucle sur tous les term balises, et vérifier si leur texte identifiant est égal à l'un de leurs broader textes:

from bs4 import BeautifulSoup 
soup = BeautifulSoup(doc, 'lxml') # doc is your string 
termList = soup.findAll("term") 
for term in termList: 
    if len(term.findAll("broader")) > 1: 
     for broader in term.findAll("broader"): 
      if term.id.text == broader.text: 
       print(term.value.text) 

imprimera:

Label2 
Label3 
+0

Pas assez. S'il vous plaît, attention à la condition que le nombre de nœuds plus larges doit être supérieur à 1. –

+0

Oh, il y a une possibilité qu'il n'y ait pas de balise 'plus large'' dans l'un des' termes '? Je n'étais pas au courant parce que j'étais concentré sur l'exemple, désolé. Je vais le modifier dès que possible. –

+0

@misio_jasio Je pense que c'est bon d'y aller, maintenant! Merci pour le commentaire! : D –