Python 在 XML 中将兄弟姐妹写在所需标签下方

Python write siblings in XML below desired tag

我正在尝试在 <VIDPOM>10</VIDPOM> 标签后添加一些兄弟标签

我的 XML 看起来像:

<ZAP>
    <N_ZAP>999</N_ZAP>
    <SLUCH>
      <IDCASE>100100100</IDCASE>
      <USL_OK>3</USL_OK>
      <VIDPOM>10</VIDPOM>
      <IDSP>99</IDSP>
      <USL>
        <IDSERV>123456789</IDSERV>
        <DATE_IN>2020-12-01</DATE_IN>
      </USL>
    </SLUCH>
</ZAP>

但我想这样:

<ZAP>
    <N_ZAP>999</N_ZAP>
    <SLUCH>
      <IDCASE>100100100</IDCASE>
      <USL_OK>3</USL_OK>
      <VIDPOM>10</VIDPOM>
      <MY_CUSTOM_TAG>TEXT IS HERE</MY_CUSTOM_TAG>
      <IDSP>99</IDSP>
      <USL>
        <IDSERV>123456789</IDSERV>
        <DATE_IN>2020-12-01</DATE_IN>
      </USL>
    </SLUCH>
</ZAP>

我的代码是:

import xml.etree.ElementTree as ET


tree = ET.parse('file.xml')
root = tree.getroot()

for SLUCH in root.iter('SLUCH'):
    IDCASE = SLUCH.find('IDCASE')
    VIDPOM = SLUCH.find('VIDPOM')
    print(IDCASE.text)
    print(VIDPOM.text)
    print()

    if IDCASE.text == "100100100":
        print('HERE')

        new_tag = ET.SubElement(VIDPOM, 'MY_CUSTOM_TAG')
        new_tag.text = 'TEXT IS HERE'
        
        tree.write('file_new.xml')

输出为:

<ZAP>
    <N_ZAP>999</N_ZAP>
    <SLUCH>
      <IDCASE>100100100</IDCASE>
      <USL_OK>3</USL_OK>
      <VIDPOM>10
        <MY_CUSTOM_TAG>TEXT IS HERE</MY_CUSTOM_TAG>
      </VIDPOM>
      <IDSP>99</IDSP>
      <USL>
        <IDSERV>123456789</IDSERV>
        <DATE_IN>2020-12-01</DATE_IN>
      </USL>
    </SLUCH>
</ZAP>

提前致谢!

您可以在 SLUCH

的 children 列表中找到 VIDPOM 的位置
index = list(SLUCH).index(VIDPOM)  # deprecated: SLUCH.getchildren().index(VIDPOM)

然后你可以 insertVIDPOM

之后的一个位置
SLUCH.insert(index+1, new_tag)

要格式化像 VIDPOM 这样的新元素(相同的缩进),您可以复制 tail

new_tag.tail = VIDPOM.tail

最少的工作代码 - 数据直接在代码中。

text ='''
<ZAP>
    <N_ZAP>999</N_ZAP>
    <SLUCH>
      <IDCASE>100100100</IDCASE>
      <USL_OK>3</USL_OK>
      <VIDPOM>10</VIDPOM>
      <IDSP>99</IDSP>
      <USL>
        <IDSERV>123456789</IDSERV>
        <DATE_IN>2020-12-01</DATE_IN>
      </USL>
    </SLUCH>
</ZAP>
'''

import xml.etree.ElementTree as ET

#tree = ET.parse('file.xml')
#root = tree.getroot()
root = ET.fromstring(text)

for SLUCH in root.iter('SLUCH'):
    VIDPOM = SLUCH.find('VIDPOM')

    new_tag = ET.Element('MY_CUSTOM_TAG')
    new_tag.text = 'TEXT IS HERE'
    new_tag.tail = VIDPOM.tail  # copy text after `tag`

    index = list(SLUCH).index(VIDPOM)
    #index = SLUCH.getchildren().index(VIDPOM)  # deprecated
    SLUCH.insert(index+1, new_tag)

print(ET.tostring(root).decode())

结果:

<ZAP>
    <N_ZAP>999</N_ZAP>
    <SLUCH>
      <IDCASE>100100100</IDCASE>
      <USL_OK>3</USL_OK>
      <VIDPOM>10</VIDPOM>
      <MY_CUSTOM_TAG>TEXT IS HERE</MY_CUSTOM_TAG>
      <IDSP>99</IDSP>
      <USL>
        <IDSERV>123456789</IDSERV>
        <DATE_IN>2020-12-01</DATE_IN>
      </USL>
    </SLUCH>
</ZAP>