【问题标题】:How to preserve namespaces when parsing xml via ElementTree in Python while trying to modify xml尝试修改xml时如何在Python中通过ElementTree解析xml时保留命名空间
【发布时间】:2021-10-10 07:18:46
【问题描述】:

我正在尝试修改 XML 并将输出写入output.xml,但我没有得到所需的输出。在我的 XML 中,我们有不同的命名空间:

  1. 根命名空间
  2. 子命名空间

我可以使用register_namespace 保留根命名空间,但我无法为<genericSelection> PSB 保留子命名空间。

有人可以帮助我实现它。

原始文件sn-p:

<ptc:PricingObjectsJXB xmlns:ptc="http://xmlns.xyz.com/comm/platform/model">  
  <genericSelection xmlns:ptc="http://xmlns.xyz.com/comm/platform/model"></genericSelection>
</ptc:PricingObjectsJXB>

输出文件sn-p:

<ptc:PricingObjectsJXB xmlns:ptc="http://xmlns.xyz.com/comm/platform/model">  
  <genericSelection> missing namespace here</genericSelection>
</ptc:PricingObjectsJXB>

提前致谢。

【问题讨论】:

    标签: python-3.x xml elementtree xml.etree


    【解决方案1】:

    您的原始文件和保存的文件是等效的。您无需执行任何操作。

    <ptc:PricingObjectsJXB xmlns:ptc="http://xmlns.xyz.com/comm/platform/model">  
      <genericSelection xmlns:ptc="http://xmlns.xyz.com/comm/platform/model"></genericSelection>
    </ptc:PricingObjectsJXB>
    

    这里,只有&lt;PricingObjectsJXB&gt; 实际上在http://xmlns.xyz.com/comm/platform/model 命名空间中。 &lt;genericSelection&gt; 声明 http://xmlns.xyz.com/comm/platform/model 命名空间,但它实际上不在该命名空间中(否则它也会有 ptc: 前缀)。

    由于命名空间已经在父节点声明,因此无需再次声明。第二个命名空间声明是多余的,这是同一件事:

    <ptc:PricingObjectsJXB xmlns:ptc="http://xmlns.xyz.com/comm/platform/model">  
      <genericSelection></genericSelection>
    </ptc:PricingObjectsJXB>
    

    这是 ElementTree 给你的,是正确的。

    【讨论】:

    • 感谢@Tomalak 快速还原,我知道通用选择不需要命名空间,但我想实现相同的 xml 结构(在 output.xml 文件中),除了层次结构下的几个值。调用 ET.write() 方法正在删除所有对我来说似乎不正确的子命名空间。我怎样才能停止删除它?
    • 如果您必须保留第二个多余的命名空间声明,请使用 lxml 而不是 ElementTree。
    • @user3832730 XML 结构相同的。如果你真的明白不需要第二次声明,你也不能说你想要第二次声明。
    猜你喜欢
    • 2019-06-23
    • 2013-01-28
    • 2014-09-24
    • 2011-05-27
    • 2014-04-08
    相关资源
    最近更新 更多