首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PythonVersion2.7: XML ElementTree:如何迭代子元素的某些元素以找到匹配

PythonVersion2.7: XML ElementTree:如何迭代子元素的某些元素以找到匹配
EN

Stack Overflow用户
提问于 2013-03-26 17:01:34
回答 3查看 45.2K关注 0票数 11

我是一个编程新手,很少使用python,所以当我试图解释我想做什么时,请耐心等待我:)

我有以下XML:

代码语言:javascript
运行
复制
<?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相匹配。据我所知,元素树不包含父引用,就像它包含了父引用一样,我可以从根中使用findall(),然后从根开始向后工作。这里是我的psuedocode:

  1. 对于文本文件中的每一行:
  2. 将Visit_Date Patient_Code New_SWOL28放入变量
  3. 对于每一个病人要素:
  4. 如果patientCode = Patient_Code
  5. 对于每一次访问内容:
  6. 如果VisitDate = Visit_Date
  7. 如果存在此访问的SWOL28元素
  8. 将SWOL28更新为New_SWOL28

但是我被困在了第五步,我怎样才能得到一个访问列表来迭代?很抱歉,如果这是一个非常愚蠢的问题,但我已经到处寻找答案,我向你保证!我已经将代码简化为下面需要修复的部分的简单示例:

代码语言:javascript
运行
复制
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的建议,我尝试了以下几点:

代码语言:javascript
运行
复制
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

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

EN

回答 3

Stack Overflow用户

发布于 2013-03-26 17:04:33

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

代码语言:javascript
运行
复制
for x in element.iter("visit"):

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

代码语言:javascript
运行
复制
element.find( "visits" )

看起来,您首先必须找到“访问”元素,它是“访问”的父元素,然后遍历它的“访问”子元素。如果把它们加在一起,你就会得到这样的东西:

代码语言:javascript
运行
复制
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文档中的“查找有趣元素”一节。

票数 7
EN

Stack Overflow用户

发布于 2013-03-26 17:09:23

您可以使用一个CssSelector从Patient元素获取您想要的节点:

代码语言:javascript
运行
复制
from lxml.cssselect import CSSSelector
visitSelector = CSSSelector('Visit')
visits =  visitSelector(child)

您可以使用相同的方法获取patientCode标记和SWOL28标记,然后可以使用element.text访问和修改元素的文本。

票数 0
EN

Stack Overflow用户

发布于 2013-03-26 17:39:01

如果使用lxml.etree,则可以使用xpath查找需要更新的元素。

例如。

代码语言:javascript
运行
复制
doc.xpath('Patient[PatientCharacteristics/patientCode=$patient]/Visits/Visit[VisitDate=$visit]',patient="3",visit="2009-07-10")

所以

代码语言:javascript
运行
复制
from lxml import etree

doc = etree.parse("DB3.xml")

changes = [
  dict(patient='3',visit='2010-08-17',swol28="99"),
]

def update_doc(x,d):
  for row in d:
    for visit in x.xpath('Patient[PatientCharacteristics/patientCode=$patient]/Visits/Visit[VisitDate=$visit]',**row):
      for swol28 in visit.xpath('DAS/Joints/SWOL28'):
        swol28.text = row['swol28']

update_doc(doc,changes)

print etree.tostring(doc)

应该给你一些东西,其中包含:

代码语言:javascript
运行
复制
<Patient>
  <PatientCharacteristics>
    <patientCode>3</patientCode>
  </PatientCharacteristics>
  <Visits>
    <Visit>
      <DAS>
      <CRP>14</CRP>
      <ESR/>
      <Joints>
        <DAS_PROFILE>28/28</DAS_PROFILE>
        <SWOL28>99</SWOL28>
        <TEN28>0</TEN28>
      </Joints>
    </DAS>
    <VisitDate>2010-08-17</VisitDate>
    </Visit>
  </Visits>
</Patient>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15643094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档