2015-09-29 35 views
0

我真的我停留在這一點,我有一個文件使用一個XML佈局是這樣的:如何在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> 

我需要在通道節點添加其他「項」,這很容易,但我不能找到用項目空間添加項目的子項。

我想用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) 

,但仍然有興趣DOIT在一個更好的解決方案

回答

0

或者,你可以使用XSLT的聲明性編程語言,即變換,風格,重新格式化,並以任何方式,形狀或形式重新構建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> 
+0

我喜歡你的方法,因爲我嘗試EV ery方式找到正確縮進輸出與lxml和他們都沒有工作,我目前使用tidylib來做到這一點。 – Dat30

相關問題