【问题标题】:lxml namespaces defined multiple timeslxml 命名空间多次定义
【发布时间】:2021-12-20 21:49:20
【问题描述】:

我正在从 python xml 切换到 lxml。我遇到了 lxml 对命名空间有相当严格的政策。

我想生成一个带有多个冗余 xmlns:ns0 命名空间声明的 xml。但是,lxml 会从子元素中剥离此命名空间。

如何通过 lxml 定义冗余命名空间?

<?xml version="1.0" ?>
<env:Envelope xmlns:env="some URI" xmlns:ns0="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://www.w3.org/2001/XMLSchema-instance">
    <env:Body>
        <ns0:getLabelResponseElement>
            <ns0:result>
                <ns1:statusMessage xmlns:ns0="http://www.w3.org/2001/XMLSchema"></ns1:statusMessage>
            </ns0:result>
        </ns0:getLabelResponseElement>
    </env:Body>
</env:Envelope>

【问题讨论】:

  • 我希望您有充分的理由需要这些冗余的命名空间声明?请在您的问题中添加您的理由 - 否则很难知道该建议什么。
  • 这大概是因为接收者使用了一些自制的方法来解析 XML。恐怕我们在 StackOverflow 上得到了很多这样的信息:尝试手动处理 XML 的人,然后发现他们只能处理一个相当奇特的 XML 子集,从而导致需要生成这个相当奇特子集的人提出问题。这一切都是因为人们没有意识到标准一致性的重要性。
  • @kimbert 原因是为了重现旧版 Java 服务的响应。
  • 很抱歉继续提问,但是......如果这些 xmlns 属性是 冗余 那么为什么需要重现它们呢?无论哪种方式,XML 都是有效的。这肯定有商业原因,因为我想不出技术原因。
  • @kimbert 此响应 XML 可能会被正则表达式解析。我不确定。

标签: python xml lxml xml-namespaces


【解决方案1】:

根据我的研究,lxml.etree 不允许在子元素中添加冗余命名空间声明,因为这违反了 XML 标准。因此,即使您在子元素 lxml 中显式重新声明命名空间,也不会将其添加到最终 XML 中。
与 lxml 不同,python xml.etree.ElementTree 库允许冗余的 xml 命名空间声明。

【讨论】:

  • 什么是“python-xml库”?
  • 这不是一个库,而是一大堆非常不同的 XML 模块。但没关系,这可能无关紧要。
  • @mzjn 是有道理的。我更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
相关资源
最近更新 更多