11

私はプログラミングの初心者で、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>

ここでやりたいのは、テキストファイルに保存したpatientCodeとVisitDateと一致する場合、特定の「SWOL28」値を更新することだけです。私が理解しているように、elementtreeには親参照が含まれていません。親参照が含まれている場合と同様に、ルートからfindall()を使用して、そこから逆方向に作業することができます。ここに立っているのは私の擬似コードです:

  1. テキストファイルの各行について:
  2. Visit_DatePatient_CodeNew_SWOL28を変数に入れます
  3. 各患者要素について:
  4. patientCode=Patient_Codeの場合
  5. 各Visit要素について:
  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

しかし、私が得る唯一の出力は次のとおりです。患者患者と下のタグはありません。何か案は?

4

4 に答える 4

7

次のように、要素「element」のすぐ下にあるすべての「visit」タグを繰り返すことができます。

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

特定のタグに一致する要素の最初の直接の子を見つけることができます:

element.find( "visits" )

最初に「visit」の親である「visits」要素を見つけてから、その「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

于 2013-03-26T17:04:33.873 に答える
6

これはテストされていませんが、必要なものにかなり近いはずです。

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)
于 2013-03-26T17:28:06.460 に答える
0

CssSelectorを使用して、Patient要素から必要なノードを取得できます。

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

同じことを行ってpatientCodeタグとSWOL28タグを取得してから、を使用して要素のテキストにアクセスして変更することができます。element.text

于 2013-03-26T17:09:23.133 に答える
0

を使用すると、更新する必要のある要素を見つけるためにlxml.etree使用できます。xpath

例えば

doc.xpath('Patient[PatientCharacteristics/patientCode=$patient]/Visits/Visit[VisitDate=$visit]',patient="3",visit="2009-07-10")

それで

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)

次のものを含むものが得られるはずです。

<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>
于 2013-03-26T17:39:01.127 に答える