如何在 python 中添加带有命名空间的 xml 子节点?

how to add xml child node with namespace in python?

我真的陷入了困境,我得到了一个 xml 布局如下的文件:

<rss xmlns:irc="SomeName" version="2.0">
    <channel>
        <item>
            <irc:title>A title</irc:title>
            <irc:poster>A poster</irc:poster>
            <irc:url>An url</irc:url>
        </item>
    </channel>
</rss>

我需要在通道节点中添加另一个 'item',这很简单,但我找不到使用命名空间添加项目子项的方法。

我正在尝试使用 lxml,但是文档对于新手来说不是很清楚 请提供任何帮助。


我找到了用 lxml

做的方法
root = xml.getroot()
channel = root.find('channel')
item = et.Element('item')
title = et.SubElement(item,'{SomeName}title')
title.text = 'My new title'
poster = et.SubElement(item,'{SomeName}poster')
poster.text = 'My poster'
poster = et.SubElement(item,'{SomeName}url')
poster.text = 'http://My.url.com'
channel.append(item)

但仍然对更好的解决方案感兴趣

或者,您可以使用 XSLT 声明性编程语言,它可以以任何方式转换、样式、re-formats 和 re-structures XML 文件、形状、或形式。 Python 的 lxml 模块维护着一个 XSLT 处理器。

只需在 XSLT 的声明行中注册所需的命名空间,然后在任何新节点中使用它。对于您当前的需求,这似乎有些过分,但在某些情况下,需要使用适当的命名空间进行更复杂的转换。下面为之前的海报添加了一个新标题和URL.

XSLT(保存为.xsl)

<?xml version="1.0" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
               xmlns:irc="SomeName">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes"/>      

<xsl:template match="rss">
  <rss>   
    <channel>
      <xsl:for-each select="//item">
        <item>
          <irc:title>My new title</irc:title>
          <xsl:copy-of select="irc:poster"/>
          <xsl:copy-of select="irc:url"/>       
        </item>
      </xsl:for-each>
    </channel>
  </rss>
 </xsl:template> 

</xsl:transform>

Python

import os
import lxml.etree as ET

# SET CURRENT DIRECTORY
cd = os.path.dirname(os.path.abspath(__file__))

# LOAD IN XML AND XSL FILES
dom = ET.parse(os.path.join(cd, 'Original.xml'))
xslt = ET.parse(os.path.join(cd, 'XSLT_Script.xsl'))

# TRANSFORM
transform = ET.XSLT(xslt)
newdom = transform(dom)

# OUTPUT FINAL XML
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True, xml_declaration=True)

xmlfile = open(os.path.join(cd, 'output.xml'),'wb')
xmlfile.write(tree_out)
xmlfile.close()

输出

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:irc="SomeName">
   <channel>
      <item>
         <irc:title>My new title</irc:title>
         <irc:poster>A poster</irc:poster>
         <irc:url>An url</irc:url>
      </item>
   </channel>
</rss>