2017-11-15 4 views
0

ich lxml in einem Versuch, die Ausgabe des folgenden XML-Code verwende:Hinzufügen eines Subelement zu einem Subelement lxml

<annotation> 
    <folder>images</folder> 
    <filename>IMG_8111.JPG</filename> 
    <size> 
     <width>400</width> 
     <height>400</height> 
    </size> 
    <segmented>0</segmented> 
    <object> 
     <name>Bottle</name> 
     <bndbox> 
      <xmin>16</xmin> 
      <ymin>71</ymin> 
      <xmax>390</xmax> 
      <ymax>323</ymax> 
     </bndbox> 
    </object> 
</annotation> 

Im mit this Tutorial lernen, wie man lxml für meine Bedürfnisse zu implementieren. Das Problem, mit dem ich konfrontiert bin, ist, dass meine gewünschte Ausgabe Unterelemente zu Unterelementen hat. Zum Beispiel - <annotation> ist mein Hauptelement, und dann sind <folder>, <filename> und <size> Unterelemente, aber dann <height> und <width>' are subelements to the `Unterelemente. Wie mache ich das mit lxml? Ich habe folgendes bisher:

from lxml import etree 
import xml.etree.cElementTree as ET 


root = etree.Element("annotation") 
etree.SubElement(root, "folder").text = "Child 1" 
etree.SubElement(root, "filename").text = "Child 2" 
size = etree.SubElement(root, "size").text = "Child 3" 
etree.SubElement(size, "width").text = "Child 4" 


with open ('xmltree.xml', 'wb') as f: 
    f.write(etree.tostring(root, pretty_print = True)) 

Aber es führt den folgenden Fehler:

etree.SubElement(size, "width").text = "Child 4" 
TypeError: Argument '_parent' has incorrect type (expected lxml.etree._Element, got str) 

Bitte helfen Sie mir, was ich falsch mache und wie es weitergeht.

Antwort

1

Damit size = etree.SubElement(root, "size").text = "Child 3" ausgewertet werden, wie Sie es erwarten, müsste es zu interpretieren als:

(size = etree.SubElement(root, "size")).text = "Child 3" 

In Python, können Sie nicht einen Auftrag ausführen in einem Ausdruck. Stattdessen interpretiert die Art und Weise Python dies:

size = "Child 3" 
etree.SubElement(root, "size").text = "Child 3" 

Sie könnten Ihren Code unter Verwendung von zwei separaten Zeilen umschreiben Ihres gewünschtes Ergebnis zu erzielen:

size = etree.SubElement(root, "size") 
size.text = "Child 3" 

Nach einem Blick durch den lxml API, scheint es nicht zu Eine Möglichkeit, ein Element zu erstellen und dem Attribut text in einer einzelnen Zeile einen Wert zuzuweisen.

+0

Vielen Dank! Das hat sich um den Fehler gekümmert und ich verstehe auch warum jetzt. Bitte sehen Sie sich meine Antwort unten an – Veejay

1

Ihre variable Größe hat den Typ string, weil sie den Wert "Kind 3" hat. Sie tun sollten:

size = etree.SubElement(root,"size") 
size.text = "child 3" 
etree.SubElement(size, "width").text="child 4" 
Verwandte Themen