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

时间:2015-09-29 00:18:05

标签: python xml xml-namespaces

我真的陷入了困境,我得到了一个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>

我需要添加另一个&#39;项目&#39;在频道节点中,这很容易,但我无法找到添加项目命名空间的项目的方法。

我正在尝试使用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)

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

1 个答案:

答案 0 :(得分:0)

或者,您可以使用声明性编程语言XSLT,以任何方式,形状或形式转换,样式化,重新格式化和重构XML文件。 Python的lxml模块维护着一个XSLT处理器。

简单地说,在XSLT的声明行中注册所需的命名空间,并在任何新节点中使用它。对于您当前的需求而言,这可能看起来有点过分,但可能存在需要使用适当的命名空间进行更复杂转换的情况。下面为上一张海报和网址添加了一个新标题。

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>