将子元素添加到 lxml 子元素
Adding a subelement to a subelement lxml
我正在使用 lxml 试图输出以下 xml 代码:
<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>
我正在使用 this 教程来学习如何根据我的需要实施 lxml。我面临的问题是我想要的输出有子元素到子元素。例如 - <annotation>
是我的主要元素,然后 <folder>
、<filename>
和 <size>
是子元素,然后 <height>
和 <width>' are subelements to the
`子元素。我如何使用 lxml 实现这一点。到目前为止我有以下内容:
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))
但它抛出以下错误:
etree.SubElement(size, "width").text = "Child 4"
TypeError: Argument '_parent' has incorrect type (expected lxml.etree._Element, got str)
请帮助我解决我做错了什么以及如何进行。
您的变量大小为字符串类型,因为它具有 "child 3" 值。你应该这样做:
size = etree.SubElement(root,"size")
size.text = "child 3"
etree.SubElement(size, "width").text="child 4"
为了让 size = etree.SubElement(root, "size").text = "Child 3"
像您期望的那样被评估,它必须被解释为:
(size = etree.SubElement(root, "size")).text = "Child 3"
在 Python 中,您不能在表达式中执行赋值。相反,Python 对此的解释是:
size = "Child 3"
etree.SubElement(root, "size").text = "Child 3"
您可以使用两行单独的代码重写您的代码以获得您想要的结果:
size = etree.SubElement(root, "size")
size.text = "Child 3"
在查看 lxml
API 之后,它似乎不是一种在一行中既创建元素又为 text
属性赋值的方法.
我正在使用 lxml 试图输出以下 xml 代码:
<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>
我正在使用 this 教程来学习如何根据我的需要实施 lxml。我面临的问题是我想要的输出有子元素到子元素。例如 - <annotation>
是我的主要元素,然后 <folder>
、<filename>
和 <size>
是子元素,然后 <height>
和 <width>' are subelements to the
`子元素。我如何使用 lxml 实现这一点。到目前为止我有以下内容:
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))
但它抛出以下错误:
etree.SubElement(size, "width").text = "Child 4"
TypeError: Argument '_parent' has incorrect type (expected lxml.etree._Element, got str)
请帮助我解决我做错了什么以及如何进行。
您的变量大小为字符串类型,因为它具有 "child 3" 值。你应该这样做:
size = etree.SubElement(root,"size")
size.text = "child 3"
etree.SubElement(size, "width").text="child 4"
为了让 size = etree.SubElement(root, "size").text = "Child 3"
像您期望的那样被评估,它必须被解释为:
(size = etree.SubElement(root, "size")).text = "Child 3"
在 Python 中,您不能在表达式中执行赋值。相反,Python 对此的解释是:
size = "Child 3"
etree.SubElement(root, "size").text = "Child 3"
您可以使用两行单独的代码重写您的代码以获得您想要的结果:
size = etree.SubElement(root, "size")
size.text = "Child 3"
在查看 lxml
API 之后,它似乎不是一种在一行中既创建元素又为 text
属性赋值的方法.