python - 如何使用 Python 将命名空间和前缀插入到 XML 字符串中?

标签 python xml elementtree xml.etree

假设我有一个 XML 字符串:

<A>
    <B foo="123">
        <C>thing</C>
        <D>stuff</D>
    </B>
</A>

我想插入一个 XML 模式使用的类型的命名空间,在所有元素名称前放置一个前缀。

<A xmlns:ns1="www.example.com">
    <ns1:B foo="123">
        <ns1:C>thing</ns1:C>
        <ns1:D>stuff</ns1:D>
    </ns1:B>
</A>

有没有办法使用 lxml.etree 或类似的库来做到这一点(除了蛮力查找替换或正则表达式)?

最佳答案

我认为仅使用 ElementTree 无法做到这一点。

操作 namespace 有时会非常棘手。 SO 上有很多关于它的问题。即使使用更高级的 lxml图书馆,真的很难。查看这些相关问题:

下面是一个使用 XSLT 的解决方案。

代码:

from lxml import etree

XML = '''
<A>
    <B foo="123">
        <C>thing</C>
        <D>stuff</D>
    </B>
</A>'''

XSLT = '''
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:ns1="www.example.com">
 <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="*">
   <xsl:element name="ns1:{name()}">
    <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
  </xsl:template>

  <!-- No prefix on the A element -->
  <xsl:template match="A">
   <A xmlns:ns1="www.example.com">
    <xsl:apply-templates select="node()|@*"/>
   </A>
  </xsl:template>
</xsl:stylesheet>'''

xml_doc = etree.fromstring(XML)
xslt_doc = etree.fromstring(XSLT)
transform = etree.XSLT(xslt_doc)
print transform(xml_doc)

输出:

<A xmlns:ns1="www.example.com">
    <ns1:B foo="123">
        <ns1:C>thing</ns1:C>
        <ns1:D>stuff</ns1:D>
    </ns1:B>
</A>

关于python - 如何使用 Python 将命名空间和前缀插入到 XML 字符串中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31864133/

相关文章:

java - SAXParseException - 解析 soap 响应时

python - 转储时如何删除ns0标签

python - 如何有条件地从带有 ElementTree 的 XML 中获取值?

xml - 用于收集属性作为每个选定节点的名称/值映射的 XPath 3.1 表达式

xml - xslt : How can I apply two templates to the same node during processing?

python-3.x - 使用 python 解析 pom.xml 文件在旧的 python 版本中不起作用

python - 在 Pandas 中的 groupby 之后查找与最大日期关联的行

python - 速度比较 : server-generated HTML vs templates?

php - 使用 PHP(XPath)、PHP/Python(Regex) 或 Python(XPath) 从 html 中提取信息

python - 有没有办法获取使用 python 的 docker API 创建 docker 镜像的日期