我有閑置的 XML:
<?xml version='1.0' encoding='UTF-8'?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://obe.nce.amadeus.net/bms/metadata/1-0/">
<B name="NAME" version="VERSION">
<AA>SOME NAME</AA>
<CC>SOME OTHER NAME</CC>
</B>
<C>
<SOME1>
<TAG_3 name="NAME_1" path="path_1"/>
<TAG_3 name="NAME_2" path="path_2"/>
<TAG_3 name="NAME_3" path="path_3"/>
</SOME1>
<SOME2>
<TAG_3 name="NAME_4" path="path_1"/>
<TAG_3 name="NAME_5" path="path_2"/>
<TAG_3 name="NAME_6" path="path_3"/>
</SOME2>
</C>
<D>
<TAG_3 type="type" name="NAME_1" version="version_1"/>
<TAG_3 type="type" name="NAME_2" version="version_2"/>
<TAG_3 type="type" name="NAME_3" version="version_3"/>
</D>
</A>
我必須把它改成這樣:
<?xml version='1.0' encoding='UTF-8'?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://obe.nce.amadeus.net/bms/metadata/1-0/">
<B name="NAME" version="VERSION">
<AA>SOME NAME</AA>
<CC>SOME OTHER NAME</CC>
</B>
<C>
<!-- SOME1 -->
<TAG_3 name="NAME_1" path="path_1"/>
<TAG_3 name="NAME_3" path="path_3"/>
<TAG_3 name="NAME_2" path="path_2"/>
<!-- SOME2 -->
<TAG_3 name="NAME_5" path="path_2"/>
<TAG_3 name="NAME_4" path="path_1"/>
<TAG_3 name="NAME_6" path="path_3"/>
</C>
<D>
<TAG_3 type="type" name="NAME_1" version="version_1"/>
<TAG_3 type="type" name="NAME_2" version="version_2"/>
<TAG_3 type="type" name="NAME_3" version="version_3"/>
</D>
</A>
你們有誰知道我怎樣才能實作這樣的目標?我試圖遍歷 SOME1 和 SOME2 的所有子級并洗掉該標簽,但我不知道如何:
- 移除 TAG 本身,例如 SOME1 和 SOME2
- 添加注釋的第一行代替該標簽
你們誰能給我任何提示我該怎么做?
uj5u.com熱心網友回復:
將元素移動到SOME1父元素
from lxml import etree
tree = etree.parse('tmp.xml')
root = tree.getroot()
c = tree.xpath('/A/C[SOME1 | SOME2]')
print(c)
for s in tree.xpath('//C[SOME1 | SOME2]/SOME1/* | //C[SOME1 | SOME2]/SOME2/*'):
print(s)
c[0].append(s)
for d in tree.xpath('//C[SOME1 | SOME2]/SOME1 | //C[SOME1 | SOME2]/SOME2'):
c[0].remove(d)
print(etree.tostring(tree, encoding="utf-8", method="xml").decode("utf-8"))
結果
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://obe.nce.amadeus.net/bms/metadata/1-0/">
<B name="NAME" version="VERSION">
<AA>SOME NAME</AA>
<CC>SOME OTHER NAME</CC>
</B>
<C>
<TAG_3 name="NAME_1" path="path_1"/>
<TAG_3 name="NAME_2" path="path_2"/>
<TAG_3 name="NAME_3" path="path_3"/>
<TAG_3 name="NAME_4" path="path_1"/>
<TAG_3 name="NAME_5" path="path_2"/>
<TAG_3 name="NAME_6" path="path_3"/>
</C>
<D>
<TAG_3 type="type" name="NAME_1" version="version_1"/>
<TAG_3 type="type" name="NAME_2" version="version_2"/>
<TAG_3 type="type" name="NAME_3" version="version_3"/>
</D>
</A>
用注釋替換已洗掉的元素
slist = tree.xpath('//C[SOME1 | SOME2]/SOME1 | //C[SOME1 | SOME2]/SOME2')
for d in slist:
if d.tag == 'SOME1':
c[0].insert(slist.index(d), etree.Comment(d.tag))
c[0][slist.index(d)].tail = "\n"
elif d.tag == 'SOME2':
c[0].insert(slist.index(d) 1, etree.Comment(d.tag))
c[0][slist.index(d) 1].tail = "\n"
slist = tree.xpath('//C[SOME1 | SOME2]/SOME1 | //C[SOME1 | SOME2]/SOME2')
for d in slist:
idx = slist.index(d)
if d.tag == 'SOME1':
for s in tree.xpath('//C[SOME1 | SOME2]/SOME1/*'):
idx = 1
c[0].insert(idx, s)
for s in tree.xpath('//C[SOME1 | SOME2]/SOME2/*'):
print(s)
c[0].append(s)
for d in tree.xpath('//C[SOME1 | SOME2]/SOME1 | //C[SOME1 | SOME2]/SOME2'):
c[0].remove(d)
結果
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://obe.nce.amadeus.net/bms/metadata/1-0/">
<B name="NAME" version="VERSION">
<AA>SOME NAME</AA>
<CC>SOME OTHER NAME</CC>
</B>
<C>
<!--SOME1-->
<TAG_3 name="NAME_1" path="path_1"/>
<TAG_3 name="NAME_2" path="path_2"/>
<TAG_3 name="NAME_3" path="path_3"/>
<!--SOME2-->
<TAG_3 name="NAME_4" path="path_1"/>
<TAG_3 name="NAME_5" path="path_2"/>
<TAG_3 name="NAME_6" path="path_3"/>
</C>
<D>
<TAG_3 type="type" name="NAME_1" version="version_1"/>
<TAG_3 type="type" name="NAME_2" version="version_2"/>
<TAG_3 type="type" name="NAME_3" version="version_3"/>
</D>
</A>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/483204.html
