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)
然后你可以 insert
在 VIDPOM
之后的一个位置
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>
我正在尝试在 <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
VIDPOM
的位置
index = list(SLUCH).index(VIDPOM) # deprecated: SLUCH.getchildren().index(VIDPOM)
然后你可以 insert
在 VIDPOM
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>