Python etree lxml 从父级移动子级
Python etree lxml moving a child from parent
我有 xml 的形式:
<b>
<a>
<c>some stuff</c>
<d> some more stuff</d>
</a>
</b>
我想将其重新格式化为:
<b>
<c>some stuff</c>
<a>
<d> some more stuff</d>
</a>
</b>
关于如何使用 Python lxml 执行此操作的任何想法?
所以我最终使用虚拟标签和 addnext 参数解决了这个问题:
def new_a(xml):
node_b=xml.xpath('/b')[0]
node_d=xml.xpath('/b/a/d')
node_d[0].addnext(etree.Element('dummy_tag'))
node_dummy=xml.xpath('/b/a/dummy_tag')
node_dummy[0].append(node_d[0])
etree.strip_tags(node_b,'a')
dummies=node_b.findall('dummy_tag')
for node in dummies:
node.tag='a'
return xml
所以如果:
xml_ini="<b><a><c>some stuff</c><d>some other stuff</d><e>even more stuff</e></a></b>"
xml=etree.fromstring(xml_ini)
xml_new=new_a(xml)
然后我们从这里开始:
<b>
<a>
<c>some stuff</c>
<d>some other stuff</d>
<e>even more stuff</e>
</a>
</b>
为此:
<b>
<c>some stuff</c>
<a>
<d>some other stuff</d>
</a>
<e>even more stuff</e>
</b>
我有 xml 的形式:
<b>
<a>
<c>some stuff</c>
<d> some more stuff</d>
</a>
</b>
我想将其重新格式化为:
<b>
<c>some stuff</c>
<a>
<d> some more stuff</d>
</a>
</b>
关于如何使用 Python lxml 执行此操作的任何想法?
所以我最终使用虚拟标签和 addnext 参数解决了这个问题:
def new_a(xml):
node_b=xml.xpath('/b')[0]
node_d=xml.xpath('/b/a/d')
node_d[0].addnext(etree.Element('dummy_tag'))
node_dummy=xml.xpath('/b/a/dummy_tag')
node_dummy[0].append(node_d[0])
etree.strip_tags(node_b,'a')
dummies=node_b.findall('dummy_tag')
for node in dummies:
node.tag='a'
return xml
所以如果:
xml_ini="<b><a><c>some stuff</c><d>some other stuff</d><e>even more stuff</e></a></b>"
xml=etree.fromstring(xml_ini)
xml_new=new_a(xml)
然后我们从这里开始:
<b>
<a>
<c>some stuff</c>
<d>some other stuff</d>
<e>even more stuff</e>
</a>
</b>
为此:
<b>
<c>some stuff</c>
<a>
<d>some other stuff</d>
</a>
<e>even more stuff</e>
</b>