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:
- Pour chaque ligne dans le fichier texte:
- Mettre Visit_Date Patient_Code New_SWOL28 dans des variables
- Pour chaque patient élément:
- Si patientCode = Patient_Code
- Pour chaque Visite de l'élément:
- Si VisitDate = Visit_Date
- Si SWOL28 élément existe, pour cette visite
- 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?
<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
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas testée par il devrait être assez proche de ce que vous voulez.
OriginalL'auteur Peter Enns
Vous pouvez effectuer une itération sur l'ensemble de la "visite" des balises directement sous l'élément "élément", comme ceci:
Vous pouvez trouver le premier enfant direct de l'élément correspondant à un certain tag:
Il semble que vous devrez d'abord de localiser les "visites" de l'élément, qui est le parent de "visite", et puis itérer sur sa "visite" des enfants. Mettre ensemble, vous auriez quelque chose comme ceci:
En général œil à la section "Trouver des éléments intéressants" dans la documentation de xml.programme etree.ElementTree: http://docs.python.org/2/library/xml.etree.elementtree.html#finding-interesting-elements
Désolé, la réponse a été un peu brouillon. Je crois que la chose que vous avez manqué était enfant.find( "bla" ) ne fait rien par lui-même-il retour le nœud qu'il a trouvé. Vous devez utiliser la valeur de retour pour continuer votre recherche.
OriginalL'auteur svk
Vous pouvez utiliser un CssSelector pour obtenir les nœuds que vous voulez à partir du Patient élément:
vous pouvez faire de même pour obtenir le patientCode Tag et tag SWOL28
ensuite, vous pouvez accéder et modifier le texte des éléments à l'aide de
element.text
dans la ligne de commande, il est tout simplement:
pip install lxml
OriginalL'auteur niroyb
Si vous utilisez
lxml.etree
, vous pouvez utiliserxpath
pour trouver les éléments dont vous avez besoin pour mettre à jour.E. g.
Donc
Devrait te rapporter quelque chose qui contient:
OriginalL'auteur MattH