首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python语言中使用ElementTree发出命名空间规范

在Python语言中使用ElementTree发出命名空间规范
EN

Stack Overflow用户
提问于 2011-02-15 06:08:23
回答 2查看 33.8K关注 0票数 35

我正在尝试发出一个包含XML声明和名称空间的XML文件,其中包含元素树。下面是我的示例代码:

代码语言:javascript
复制
from xml.etree import ElementTree as ET
ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("STUFF")
body = ET.SubElement(root, "MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,
           method="xml" )

但是,既不显示<?xml标记,也不显示任何名称空间/前缀信息。我有点迷惑了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 11:00:26

尽管docs另有说明,但我只能通过同时指定xml_declaration和编码来获得<?xml>声明。

您必须在已注册的名称空间中声明节点,才能在文件中的节点上获得名称空间。以下是您的代码的修复版本:

代码语言:javascript
复制
from xml.etree import ElementTree as ET
ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,encoding='utf-8',
           method="xml")

输出(page.xml)

代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?><com:STUFF xmlns:com="http://www.company.com"><com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF></com:STUFF>

ElementTree的打印效果也不好。下面是打印得很漂亮的输出:

代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?>
<com:STUFF xmlns:com="http://www.company.com">
    <com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF>
</com:STUFF>

您还可以声明一个默认名称空间,而不需要注册一个:

代码语言:javascript
复制
from xml.etree import ElementTree as ET

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)

tree.write("page.xml",
           xml_declaration=True,encoding='utf-8',
           method="xml",default_namespace='http://www.company.com')

输出(精美字体间距是我的)

代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?>
<STUFF xmlns="http://www.company.com">
    <MORE_STUFF>STUFF EVERYWHERE!</MORE_STUFF>
</STUFF>
票数 43
EN

Stack Overflow用户

发布于 2011-02-15 06:39:40

我从来没有能够以编程的方式从元素树库中获得<?xml标记,所以我建议您尝试这样做。

代码语言:javascript
复制
from xml.etree import ElementTree as ET
root = ET.Element("STUFF")
root.set('com','http://www.company.com')
body = ET.SubElement(root, "MORE_STUFF")
body.text = "STUFF EVERYWHERE!"

f = open('page.xml', 'w')
f.write('<?xml version="1.0" encoding="UTF-8"?>' + ET.tostring(root))
f.close()

非std lib python ElementTree实现可能有不同的方式来指定名称空间,所以如果您决定迁移到lxml,那么声明这些名称空间的方式也会有所不同。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4997848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档