2017-03-29 1 views
1

Ich habe diese xml (es ist ein Teil eines ausgedehnteren eins), die ich mit Python und lxmlneuen Wert auf Attribute in einem Namespace Set

<om:OM_Observation gml:id="observation"> 
<gml:description>Wind Speed</gml:description>  
<om:phenomenonTime xlink:href="#phenomenonTime"/> 
<om:resultTime xlink:href="#phenomenonTime"/> 
<om:procedure xlink:href="procedure"/> 
<om:observedProperty xlink:href="WS_5min_avg"/> 
<om:featureOfInterest xlink:href="#FOI"/> 
<om:result xsi:type="gml:MeasureType" uom="m/s">568</om:result> 
</om:OM_Observation> 

Ich bin in der Lage Parsen den Text zu erhalten Wert innerhalb der Tags und seinen Wert ändern und die Datei data.xml aktualisieren:

from lxml import etree 
data='data.xml' 
data_tree = etree.parse(data) 
root = data_tree.getroot() 
nsmap = {'xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xlink': 'http://www.w3.org/1999/xlink', 'gml': 'http://www.opengis.net/gml/3.2', 'om': 'http://www.opengis.net/om/2.0'} 

result=data_tree.xpath("//om:OM_Observation/om:result", namespaces=nsmap) 
result[0].text="114"  
etree.ElementTree(root).write(data, xml_declaration=True, encoding='utf-8', method="xml", pretty_print=True) 

Was ich von dem Attribut den Wert tun möchte, ist zu ändern und die xML-Datei zu aktualisieren. Ich versuche einen ähnlichen Ansatz, aber es funktioniert nicht. Ich bin in der Lage, den Wert des Attributs zu erhalten:

featureOfInterest_attr=tree.xpath("//om:featureOfInterest/@xlink:href", namespaces=nsmap) 

aber wenn ich möchte den Wert ändern mit:

tree.xpath("//om:featureOfInterest/@xlink:href",namespaces=nsmap)="#newFOI" 
etree.ElementTree(root).write(data, xml_declaration=True,encoding='utf-8', method='xml', pretty_print=True) 

wird der neue Wert nicht eingefügt. Was mache ich falsch?

Antwort

2

Ihr letztes Code-Snippet hat einen entscheidenden Unterschied zu Ihrem erfolgreichen Code. xpath() kehrt Liste, so dass Sie die Position in der Liste angeben, muss mithilfe von Index aktualisiert werden:

result = tree.xpath("//om:featureOfInterest/@xlink:href",namespaces=nsmap) 
result[0] = "#newFOI" 
# or 
# tree.xpath("//om:featureOfInterest/@xlink:href",namespaces=nsmap)[0] = "#newFOI" 

Offenbar können wir nicht Attribute aktualisieren, die direkt ausgewählt wurden mit xpath(), seit der Rückkehr Wert ist nur eine Liste von Zeichenfolgen. In diesem Fall aktualisiert result[0] = ... nur den Wert des ersten Elements der Liste und wirkt sich nicht auf den Quell-XML-Baum aus. Wir müssen stattdessen das übergeordnete Element des Attributs abrufen und dann von dort aktualisieren:

result = tree.xpath("//om:featureOfInterest",namespaces=nsmap) 
result[0].attrib['{%s}href' % nsmap['xlink']] = "#newFOI" 
+0

Hallo @ har07 Sie haben Recht. Danke für diesen ersten Vorschlag. Aber leider kann ich die XML-Datei immer noch nicht mit dem neuen Attributwert aktualisieren. Fehle ich noch etwas? –

+0

hast du deinen 'data_tree' nach der Änderung wieder auf die Platte/Datei geschrieben? – har07

+0

Ja, ich tat wie in der post angegeben etree.ElementTree (root) .write (data.xml, xml_declaration = True, encoding = 'utf-8', methode = 'xml', pretty_print = True) –

Verwandte Themen