10

我有一个 xml 文件,类似于:

<tag attrib1='I'>
  <subtag1 subattrib1='1'>
    <subtext>text1</subtext>
  </subtag1>
  <subtag3 subattrib3='3'>
    <subtext>text3</subtext>
  </subtag3>
</tag>

我想插入一个新的子元素,所以结果会是这样的

<tag attrib1='I'>
  <subtag1 subattrib1='1'>
    <subtext>text1</subtext>
  </subtag1>
  <subtag2 subattrib2='2'>
    <subtext>text2</subtext>
  </subtag2>
  <subtag3 subattrib3='3'>
    <subtext>text3</subtext>
  </subtag3>
</tag>

我可以附加我的 xml 文件,但新元素将被插入到最后。如何强制 python lxml 将其置于给定位置?

谢谢你的帮助!

4

1 回答 1

21

您可以使用addnext()方法:

from lxml import etree

XML= """
<tag attrib1='I'>
  <subtag1 subattrib1='1'>
    <subtext>text1</subtext>
  </subtag1>
  <subtag3 subattrib3='3'>
    <subtext>text3</subtext>
  </subtag3>
</tag>"""

parser = etree.XMLParser(remove_blank_text=True)
tag = etree.fromstring(XML, parser)

subtag1 = tag.find("subtag1")
subtag2 = etree.Element("subtag2", subattrib2="2")
subtext = etree.SubElement(subtag2, "subtext")
subtext.text = "text2"
subtag1.addnext(subtag2)   # Add subtag2 as a following sibling of subtag1

print etree.tostring(tag, pretty_print=True)

输出:

<tag attrib1="I">
  <subtag1 subattrib1="1">
    <subtext>text1</subtext>
  </subtag1>
  <subtag2 subattrib2="2">
    <subtext>text2</subtext>
  </subtag2>
  <subtag3 subattrib3="3">
    <subtext>text3</subtext>
  </subtag3>
</tag>

替代方案:insert()在根元素上使用:

subtag2 = etree.Element("subtag2", subattrib2="2")
subtext = etree.SubElement(subtag2, "subtext")
subtext.text = "text2"
tag.insert(1, subtag2)   # Add subtag2 as the second child (index 1) of the root element
于 2013-04-10T06:47:14.697 回答