使用lxml时,XML能否不带命名空间属性渲染?

9 投票
3 回答
2949 浏览
提问于 2025-04-16 12:20

我正在用lxml生成一些XML,生成的节点是这样的:

<QBXML xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
py:pytype="TREE">

还有:

<MaxReturned py:pytype="int">

这些自定义属性让Quickbooks的解析器受不了。有没有办法让LXML生成的内容不带这些自定义的东西?

3 个回答

-2

如果你在使用

etree.fromstring(xml_response)

那么这样做:

xml_response.replace(' xmlns:', ' xmlnamespace:').replace(' xmlns=', ' xmlnamespace=')

就可以避免它解析命名空间。

0

如果你想要创建嵌套的XML结构,可以这样做:

from lxml import objectify
doc = objectify.ElementMaker(annotate=False)
doc = (objectify.E.configuration(getattr(objectify.E,'networklists'),name="acl.conf",description="Network Lists"))
objectify.deannotate(doc,cleanup_namespaces=True)

带有自定义属性的输出结果看起来是这样的:

<configuration description="Network Lists" name="acl.conf">
<network-lists>

</network-lists>
</configuration>
13

看起来下面的代码可以解决这个问题:

objectify.deannotate(root, xsi_nil=True)
etree.cleanup_namespaces(root)

或者,如果你使用的是 lxml 版本大于等于 2.3.2(感谢 @Pedru):

objectify.deannotate(root, cleanup_namespaces=True, xsi_nil=True)

撰写回答