Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7版:XML ElementTree:如何迭代子元素的某些元素以找到匹配项_Python_Xml_Elementtree - Fatal编程技术网

Python 2.7版:XML ElementTree:如何迭代子元素的某些元素以找到匹配项

Python 2.7版:XML ElementTree:如何迭代子元素的某些元素以找到匹配项,python,xml,elementtree,Python,Xml,Elementtree,我是一个编程新手,很少使用python,所以请耐心听我解释我想做什么:) 我有以下XML: <?xml version = "1.0" encoding = "utf-8"?> <Patients> <Patient> <PatientCharacteristics> <patientCode>3</patientCode>

我是一个编程新手,很少使用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>
我将非常感谢你们中的任何一位对此有任何想法。我不是天生的编程高手,这是肯定的

提前感谢,, 莎拉

编辑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
但我得到的唯一结果是: 病人 病人
下面的标签都没有。有什么想法吗?

您可以直接迭代元素“element”下的所有“visit”标记,如下所示:

for x in element.iter("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
您可以找到与某个标记匹配的元素的第一个直接子元素:

element.find( "visits" )
看起来您必须首先找到“visit”元素,它是“visit”的父元素,然后遍历它的“visit”子元素。把它们放在一起,你会得到如下结果:

for x in element.iter("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文档中的“查找感兴趣的元素”一节:

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

from lxml.cssselect import CSSSelector
visitSelector = CSSSelector('Visit')
visits =  visitSelector(child)
您可以通过同样的方法获取patientCode标签和SWOL28标签
然后,您可以使用
元素访问和修改元素的文本。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)

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

例如

所以

应该为您提供包含以下内容的内容:

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

3.
14
28/28
99
0
2010-08-17

您似乎没有顶级标记,例如,
您是否编辑了该标记,或者这是您的文档吗?很抱歉,是的,现在刚刚将其添加到其中。谢谢我会在这里使用
lxml
(API兼容库),并使用xpath表达式。使用正确的XPath表达式选择正确的访问非常简单。非常感谢,我尝试了您的答案,但没有结果,请参见编辑1。抱歉,答案有点混乱。我相信你错过的是那个child.find(“blah”)本身不会做任何事情——它会返回找到的节点。您需要使用返回值继续搜索。
elem.iter('visit')
是否迭代“elem”(第一级或内部级别)标记中具有“visit”标记的所有元素?或者它只适用于一级儿童?我的python版本没有lxml,我考虑过安装它,但它有点超出了我的深度!谢谢你!真管用!非常感谢,我不敢相信这是那么容易,踢自己!!!顺便说一句,你是个天才:)
<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>