Python 如何从lxml树中剥离名称空间?
下面是 多亏了@Tichodroma,我有了以下代码: 如果可以使用,请尝试以下操作:Python 如何从lxml树中剥离名称空间?,python,xml,lxml,xml-namespaces,prefix,Python,Xml,Lxml,Xml Namespaces,Prefix,下面是 多亏了@Tichodroma,我有了以下代码: 如果可以使用,请尝试以下操作: import lxml.etree tree = lxml.etree.parse("leg.xml") for dog in tree.xpath("//Leg1:Dog", namespaces={"Leg1": "http://what.not"}): parent = dog.xpath("..")[0] parent.remo
import lxml.etree
tree = lxml.etree.parse("leg.xml")
for dog in tree.xpath("//Leg1:Dog",
namespaces={"Leg1": "http://what.not"}):
parent = dog.xpath("..")[0]
parent.remove(dog)
parent.text = None
tree.write("leg.out.xml")
现在leg.out.xml
如下所示:
<?xml version="1.0"?>
<Leg1:MOR xmlns:Leg1="http://what.not" oCount="7">
<Leg1:Order>
<Leg1:CTemp id="FO">
<Leg1:Group bNum="001" cCount="4"/>
<Leg1:Group bNum="002" cCount="4"/>
</Leg1:CTemp>
<Leg1:CTemp id="GO">
<Leg1:Group bNum="001" cCount="4"/>
<Leg1:Group bNum="002" cCount="4"/>
</Leg1:CTemp>
</Leg1:Order>
</Leg1:MOR>
如何修改代码以从所有元素的标记名中删除
Leg1:
名称空间前缀?从每个元素中删除名称空间前缀的一种可能方法:
def strip_ns_prefix(tree):
#iterate through only element nodes (skip comment node, text node, etc) :
for element in tree.xpath('descendant-or-self::*'):
#if element has prefix...
if element.prefix:
#replace element name with its local name
element.tag = etree.QName(element).localname
return tree
另一个版本在xpath中检查命名空间,而不是使用if
语句:
def strip_ns_prefix(tree):
#xpath query for selecting all element nodes in namespace
query = "descendant-or-self::*[namespace-uri()!='']"
#for each element returned by the above xpath query...
for element in tree.xpath(query):
#replace element name with its local name
element.tag = etree.QName(element).localname
return tree
我看了一眼,没法让它工作。可能是《谢谢》的翻版。这本书非常好用。它也非常适合我的方法。您可能还需要调用
etree.cleanup\u名称空间(树)
-否则etree.tostring(树)
仍将显示名称空间。第二种方法更健壮(默认名称空间)