Python 版本 2.7 : XML ElementTree: How to iterate through certain elements of a child element in order to find a match

标签 python xml elementtree

我是一名编程新手,很少使用 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. 将 Visit_Date Patient_Code New_SWOL28 放入变量
  3. 对于每个患者元素:
  4. 如果 patientCode = Patient_Code
  5. 对于每个访问元素:
  6. 如果 VisitDate = Visit_Date
  7. 如果此次访问存在 SWOL28 元素
  8. 将 SWOL28 更新为 New_SWOL28

但我卡在了第 5 步。如何获得要迭代的访问列表?如果这是一个非常愚蠢的问题,我深表歉意,但我向您保证,我已经到处寻找答案!我已将我的代码精简为我需要在下面修复的部分的简单示例:

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

但我得到的唯一输出是: 病人 病人 并且没有较低的标签。有什么想法吗?

最佳答案

您可以直接在元素“元素”下迭代所有“访问”标签,如下所示:

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

关于Python 版本 2.7 : XML ElementTree: How to iterate through certain elements of a child element in order to find a match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15643094/

相关文章:

python - 如何修补/模拟 logging.getlogger()

windows - 如何将 Windows 应用程序与特定文件类型相关联,但与其他应用程序共享该关联?

c# - 更改 XmlElement 名称属性

python - 搜索特定 XML 元素属性值

python - Pylint 错误消息 : "E1101: Module ' lxml. etree'没有 'strip_tags' 成员'”

python - 如何使用Python的ElementTree获取child的child

Python、SQLite 和线程

python - 导入错误 : No module named - Python

python - 对列表中的连续数字求和。 Python

javascript - 解析 XML namespace ?