使用python修改xml

时间:2015-11-30 22:43:34

标签: python xml jenkins amazon-s3

我有一个已经由python生成的xml文件,它看起来像这样。它有多个项目。

xml_screenshot

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
    <title>title-name-xyz</title>
    <link>http://dist.stage.xyzgauri.com/qa/partner/mac.xml</link>
    <description>Most recent changes</description>
    <language>en</language>

<item>
<title>Version 3.0.22.4</title>
<sparkle:releaseNotesLink>
    https://dist.stage.xyzgauri.com.com/qa/partner/mac_notes.html
</sparkle:releaseNotesLink>
<pubDate>Thu, 12 Nov 2015 04:38:23 -0000</pubDate>
<enclosure
    url="https://dist.stage.xyzgauri.com/qa/sandisk/InstallCloud.3.0.22.4.pkg"
    sparkle:version="3.0.22.4"
    sparkle:shortVersionString="3.0.22"
    openlength="30455215"
    type="application/octet-stream"
    sparkle:dsaSignature="MCwCFHvf7peesvwR0AhRbZxTViLarxcjfd758mHPbnOW6wA=="
    sparkle:status="live"
/>

<item>
<title>Version 3.0.10.4</title>
<sparkle:releaseNotesLink>
    http://dist.stage.xyzgauri.com/qa/partner/mac_notes.html
</sparkle:releaseNotesLink>
<pubDate>Tue, 03 Nov 2015 04:31:18 -0000</pubDate>
<enclosure
    url="http://dist.stage.xyzgauri.com/qa/partner/InstallCloud.3.0.10.4.pkg"
    sparkle:version="3.0.10.4"
    sparkle:shortVersionString="3.0.10"
    openlength="29709636"
    type="application/octet-stream"
    sparkle:dsaSignature="MCwCFDPvLPr7lYkrx5L5XCDbhXYqrFkGzLtLePK6ng=="
    sparkle:status="live"
/>

我需要使用python来改变闪光:来自&#34; live&#34;到期&#34;已过期&#34;对于旧版本3.0.10.4。稍后将此xml推送到S3。 我是python的新手,因此想知道如何实现它。我甚至可以创建一个全新的jenkins作业来获取这个xml并修改它然后推送到S3。 任何帮助表示赞赏。 感谢。

1 个答案:

答案 0 :(得分:0)

考虑使用XSLT包的lxml解决方案,您可以避免在XPath解决方案中需要循环遍历所有元素。此处的脚本运行标识转换以按原样复制所有节点和属性,然后专门在属性集@sparkle:status中的兄弟属性@sparkle:version='3.0.10.4'的所有实例上运行模板。另外请注意,我必须在XSLT的头文件中声明sparkle命名空间。

下面将XSLT脚本作为字符串加载,但您可以像处理XML文件一样从外部文件(以.xsl或.xslt格式保存)中解析它。

import lxml.etree as ET

# LOAD XML LAND XSL
dom = ET.parse('Input.xml')

xslstr='''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                         xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
          <xsl:output version="1.0" encoding="UTF-8" indent="yes" />

            <!-- Identity Transform -->
            <xsl:template match="@*|node()">
              <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
            </xsl:template>

            <xsl:template match="enclosure[@sparkle:version='3.0.10.4']/@sparkle:status">    
              <xsl:attribute name="sparkle:status">expired</xsl:attribute>    
            </xsl:template>

          </xsl:transform>'''  

xslt = ET.fromstring(xslstr)

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

# SAVE OUTPUT
tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True,  xml_declaration=True)
print(tree_out.decode("utf-8"))

xmlfile = open('Output.xml','wb')
xmlfile.write(tree_out)
xmlfile.close()