Python版本2.7:XML元素树:如何遍历子元素的某些元素以找到匹配项

2024-05-15 00:39:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个编程新手,很少使用python,所以在我解释我要做的事情时请容忍我:)

我有以下XML:

<?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>

我要做的就是更新某些“SWOL28”值,如果它们与我存储在文本文件中的patientCode和VisitDate匹配。据我所知,elementtree不包含父引用,就像它包含父引用一样,我可以从根目录使用findall()并从根目录向后工作。这里是我的密码:

  1. 对于文本文件中的每一行:
  2. 将就诊日期患者代码新的SWOL28放入变量中
  3. 对于每个患者元素:
  4. 如果Patient Code=病人代码
  5. 对于每个访问元素:
  6. 如果VisitDate=就诊日期
  7. 如果此次访问存在SWOL28要素
  8. 将SWOL28更新为新的

但我被困在第五步。如何获得要迭代的访问列表?抱歉,如果这是一个非常愚蠢的问题,但我已经搜索了高和低的答案,我向你保证!我已经将代码简化为下面需要修复的部分的一个简单示例:

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

我非常感谢你们在这方面的任何想法。当然,我不是天生的编程高手!

提前谢谢你, 莎拉

编辑1:

根据SVK的建议,我尝试了以下方法:

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

但我得到的唯一结果是: 病人 病人 下面的标签都没有。有什么想法吗?


Tags: childxmlvisitprofilevisitspatientesrdas
3条回答

您可以直接在元素“element”下遍历所有“visit”标记,如下所示:

for x in element.iter("visit"):

您可以找到元素的第一个直接子元素,它与特定的标记匹配:

element.find( "visits" )

看起来您必须首先找到“visits”元素,它是“visit”的父元素,然后遍历其“visit”子元素。把这些放在一起你会得到这样的东西:

for patient_element in root:
    print patient_element.tag 
    visits_element = patient_element.find( "visits" )
    for visit_element in visits_element.iter("visit"):
        print visit_element.tag, visit_element.text
        # ... further processing of each visit element here

一般来说,查看xml.etree.ElementTree文档中的“查找感兴趣的元素”部分:http://docs.python.org/2/library/xml.etree.elementtree.html#finding-interesting-elements

可以使用CssSelector从Patient元素获取所需的节点:

from lxml.cssselect import CSSSelector
visitSelector = CSSSelector('Visit')
visits =  visitSelector(child)

您也可以这样做,以获得patientCode标签和SWOL28标签 然后可以使用element.text访问和修改元素的文本

这是未经测试的应该是相当接近你想要的。

for patient in root:
    patient_code =  patient.find('PatientCharacteristics').find('patientCode')
    if patient_code.text == code:
            for visit in patient.find('Visits'):
                    visit_date = visit.find('VisitDate')
                    if visit_date.text == date:
                        swol28 = visit.find('DAS').find('Joints').find('SWOL28')
                        if swol28.text:
                            visit.find('DAS').find('Joints').set('SWOL28', new_swol28)

相关问题 更多 >

    热门问题