Une version de Python 2.7: XML ElementTree: Comment parcourir certains éléments d'un enfant de l'élément afin de trouver une correspondance

Je suis un novice en programmation et que rarement l'utilisation de python, de sorte s'il vous plaît garder avec moi comme je l'ai essayer d'expliquer ce que je suis en train de faire 🙂

J'ai le code XML suivant:

<?xml version = "1.0" encoding = "utf-8"?>
<Patients>
<Patient>
<PatientCharacteristics>
<patientCode>3</patientCode>
</PatientCharacteristics>
<Visits>
<Visit>
<DAS>
<CRP>14</CRP>
<ESR/>
<Joints>
<DAS_PROFILE>28/28</DAS_PROFILE>
<SWOL28>20</SWOL28>
<TEN28>20</TEN28>
</Joints>
</DAS>
<VisitDate>2010-02-17</VisitDate>
</Visit>
<Visit>
<DAS>
<CRP>10</CRP>
<ESR/>
<Joints>
<DAS_PROFILE>28/28</DAS_PROFILE>
<SWOL28>15</SWOL28>
<TEN28>20</TEN28>
</Joints>
</DAS>
<VisitDate>2010-02-10</VisitDate>
</Visit>
</Visits>
</Patient>
<Patient>
<PatientCharacteristics>
<patientCode>3</patientCode>
</PatientCharacteristics>
<Visits>
<Visit>
<DAS>
<CRP>14</CRP>
<ESR/>
<Joints>
<DAS_PROFILE>28/28</DAS_PROFILE>
<SWOL28>34</SWOL28>
<TEN28>0</TEN28>
</Joints>
</DAS>
<VisitDate>2010-08-17</VisitDate>
</Visit>
<Visit>
<DAS>
<CRP>10</CRP>
<ESR/>
<Joints>
<DAS_PROFILE>28/28</DAS_PROFILE>
<SWOL28></SWOL28>
<TEN28>2</TEN28>
</Joints>
</DAS>
<VisitDate>2010-07-10</VisitDate>
</Visit>
<Visit>
<DAS>
<CRP>9</CRP>
<ESR/>
<Joints>
<DAS_PROFILE>28/28</DAS_PROFILE>
<SWOL28>56</SWOL28>
<TEN28>6</TEN28>
</Joints>
</DAS>
<VisitDate>2009-07-10</VisitDate>
</Visit>
</Visits>
</Patient>
</Patients>

Tout ce que je veux faire ici est de mettre à jour certaines 'SWOL28 valeurs si elles correspondent à la patientCode et VisitDate que j'ai stocké dans un fichier texte. Ce que je comprends, elementtree ne comprend pas un parent de référence, comme si elle le faisait, je pouvais findall() à partir de la racine et de travailler à rebours à partir de là. Comme il se trouve ici, c'est mon psuedocode:

  1. Pour chaque ligne dans le fichier texte:
  2. Mettre Visit_Date Patient_Code New_SWOL28 dans des variables
  3. Pour chaque patient élément:
  4. Si patientCode = Patient_Code
  5. Pour chaque Visite de l'élément:
  6. Si VisitDate = Visit_Date
  7. Si SWOL28 élément existe, pour cette visite
  8. Mise à jour SWOL28 à New_SWOL28

Mais je suis bloqué à l'étape numéro 5. Comment puis-je obtenir une liste des visites à itérer? Toutes mes excuses si c'est un très bête question, mais j'ai cherché haut et bas pour la réponse, je vous assure! J'ai dépouillé mon code pour le nu-exemple de la partie j'ai besoin de fixer ci-dessous:

import xml.etree.ElementTree as ET
tree = ET.parse('DB3.xml')
root = tree.getroot()
for child in root: # THIS GETS ME ALL THE PATIENT ATTRIBUTES
print child.tag 
for x in child/Visit: # THIS IS WHAT I CANNOT FIND THE CORRECT SYNTAX FOR
# I WOULD THEN PERFORM STEPS 6, 7 AND 8 HERE

Je serais extrêmement reconnaissante de toutes les idées tout de vous pouvez avoir sur ce. Je ne suis pas une programmation naturel, c'est sûr!

Merci d'avance,
Sarah

Edit 1:

Sur les conseils de la SVK ci-dessous, j'ai essayé le suivant:

import xml.etree.ElementTree as ET
tree = ET.parse('Untitled.xml')
root = tree.getroot()
for child in root:
print child.tag 
child.find( "visits" )
for x in child.iter("visit"):
print x.tag, x.text

Mais la seule sortie que j'obtiens est:
Patient
Patient
et aucun des baisse des balises. Des idées?

Vous ne semblent pas avoir un haut niveau de la balise, par exemple <Patients> avez-vous modifier ce que, ou est-ce votre document?
Désolé, oui, juste ajouté ça là maintenant. Merci!
Je voudrais utiliser lxml ici (API compatible bibliothèque) et d'utiliser des expressions xpath. Avec le droit de l'expression XPath la sélection de la bonne des visites est assez facile.

OriginalL'auteur Sarah-Ann | 2013-03-26