Python lxml - 如何向ALREADY CREATED元素添加其他命名空间条目?

时间:2013-12-24 18:29:50

标签: python xml lxml

好的,这应该很简单,但我无法弄明白。如何命名空间添加到已创建的元素中?

如果我有:

myxml = '<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<p:obj xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
<p:part>Part1</p:part></p:obj>'

root = XML(myxml)

使用lxml,如何添加额外的命名空间?

xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"

因此结果xml应如下所示:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<p:obj xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<p:part>Part1</p:part></p:obj>`

请注意,我需要添加已创建的元素。

2 个答案:

答案 0 :(得分:0)

你想要的是here。但是,它使用xml包。您可以使用lxml包非常相似地获得相同的结果。

from lxml import etree
etree.register_namespace('a',"http://schemas.openxmlformats.org/drawingml/2006/main")
myxml = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?><p:obj xmlns:p='http://schemas.openxmlformats.org/presentationml/2006/main'><p:part>Part1</p:part></p:obj>"
root = etree.XML(myxml)

答案 1 :(得分:0)

元素的nsmap是只读的,因此在lxml中创建元素后无法更新。来自docs...

  

因此,修改返回的dict不会对Element产生任何有意义的影响。对它的任何更改都将被忽略。

从长远来看,您可能更容易预先构建nsmap,将其添加到根目录然后添加子项。如果你只输入xml字符串,这可能意味着更多的工作,你将不得不解析子元素。如果这是一个非常大的文档,您将需要查看iterparse