2016-12-22 2 views
1

Verwenden xml.etree Ich muss auf ein Element durch eine Schlüsselkennung zugreifen.Zugreifen auf Kinder nach Schlüsselattribut

Having als Beispiel

<?xml version="1.0" encoding="utf-8" ?> 
<Models> 
    <Model Id="1" Name="booname" Description="boo" Filter="b"> 
     <ModelVariables> 
      <Variable Id="1" Token="tothh" /> 
      <Variable Id="2" Token="avgtt" /> 
     </ModelVariables> 
     <Terms> 
      <Term Id="1" Description="ln1" Coefficient="0.24160834" /> 
      <Term Id="2" Description="ln2" Coefficient="-0.09360441" /> 
     </Terms> 
    </Model> 
    <Model Id="2" Name="fooname" Description="foo" Filter="f"> 
     <Terms> 
      <Term Id="1" Description="e1" Coefficient="0.36310718" /> 
      <Term Id="2" Description="e2" Coefficient="-0.24160834" /> 
     </Terms> 
    </Model> 
</Models> 

Wie kann ich die Elemente zuzugreifen nach dem id-Wert? Wenn das Argument 2 übergeben wird, was ist der direkteste Weg, um auf alle Attribute für Modell fooname zuzugreifen?

habe ich versucht findtext, find und get Verfahren mit einer Variation der Argumente zu verwenden, aber ich kann das gewünschte Element zuzugreifen.

Antwort

0

xml.etree.ElementTreesupports a limited XPath language functionality, aber das ist genug, um ein Element von einem bestimmten Wert eines Attributs zu erhalten:

import xml.etree.ElementTree as ET 

data = """<?xml version="1.0" encoding="utf-8" ?> 
<Models> 
    <Model Id="1" Name="booname" Description="boo" Filter="b"> 
     <ModelVariables> 
      <Variable Id="1" Token="tothh" /> 
      <Variable Id="2" Token="avgtt" /> 
     </ModelVariables> 
     <Terms> 
      <Term Id="1" Description="ln1" Coefficient="0.24160834" /> 
      <Term Id="2" Description="ln2" Coefficient="-0.09360441" /> 
     </Terms> 
    </Model> 
    <Model Id="2" Name="fooname" Description="foo" Filter="f"> 
     <Terms> 
      <Term Id="1" Description="e1" Coefficient="0.36310718" /> 
      <Term Id="2" Description="e2" Coefficient="-0.24160834" /> 
     </Terms> 
    </Model> 
</Models>""" 

root = ET.fromstring(data) 

id_value = "2" 
model = root.findall(".//Model[@Id='%s']" % id_value)[0] 
print(model.attrib) 

Er druckt:

{'Id': '2', 'Name': 'fooname', 'Description': 'foo', 'Filter': 'f'} 

Beachten Sie die Verwendung von .attrib die Elementattribute zugreifen .

Verwandte Themen