私はプログラミングの初心者で、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()を使用して、そこから逆方向に作業することができます。ここにあるのは私の擬似コードです:
しかし、私はステップ番号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
しかし、私が得る唯一の出力は、Patient Patientであり、下のタグはありません。何か案は?
これはテストされていませんが、必要なものにかなり近いはずです。
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)
次のように、要素「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 -要素
CssSelectorを使用して、Patient要素から必要なノードを取得できます。
from lxml.cssselect import CSSSelector
visitSelector = CSSSelector('Visit')
visits = visitSelector(child)
同じことを行ってpatientCodeタグとSWOL28タグを取得し、element.text
を使用して要素のテキストにアクセスして変更することができます。
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>