【问题标题】:Creating xml doc with python/ElementTree and namespaces使用 python/ElementTree 和命名空间创建 xml 文档
【发布时间】:2011-09-05 20:14:04
【问题描述】:

我正在尝试创建一个内存中的 xml 文档,以便根的子节点都需要一个名称空间。

最终的文档应该是这样的:

<Feed>            
<FeedEntity Id="0000" 
      xmlns="http://schemas.example.com/search/query/2010/5/revision">

    <FeedRequest locale="en-US" title="<some value>"/>
</FeedEntity>
... another FeedEntity element ...
</Feed>            

但是,当我打印出使用 ElementTree lib 创建的文档时,它看起来更像这样:

<Feed>
    <ns0:FeedEntity Id="0000"
      xmlns:ns0="http://schemas.example.com/search/query/2010/5/revision">

        <FeedRequest locale="en-US" title="<some value>"/>
    </ns0:FeedEntity>
</Feed>

这是我创建文档的方式:

counter = 0
namespace = "http://schemas.example.com/search/query/2010/5/revision"

root = Element("Feed")        

node_name = "{%s}FeedEntity" % (namespace, );                
feed_entity_element = Element(node_name)        

feed_entity_element["Id"] = "%04d" % (counter,);

feed_request_element = Element("FeedRequest");
feed_request_element["Culture"] = self.culture;
feed_request_element["Query"] = address;        

# append each of the elements to the xml document 
feed_entity_element.append(feed_request_element);

root.append(feed_entity_element);

str_data = ET.tostring(root)
print str_data

如何去除最终 XML 中的“ns0”部分,使其看起来更像上面提到的第一个示例?

【问题讨论】:

  • 你为什么要改变它——任何使用 XML 的东西都应该把这两个版本一视同仁。

标签: python elementtree


【解决方案1】:

使用xml.etree,您无法获得第一个示例中的确切输出,但您可以使用(全局)register_namespace() 函数使用比“ns0”“更好”的前缀。例如:ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision') 将确保输出看起来像 rev:FeedEntity

但是,(兼容的)lxml 库在命名空间前缀和allows you to provide a prefix mapping when creating an element 方面更加灵活。

【讨论】:

  • 原来你也可以为元素分配属性'xmlns',它会产生相同的xml字符串输出。
猜你喜欢
  • 2011-04-23
  • 2020-10-17
  • 2018-09-12
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2010-10-06
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多