首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python修改xml

使用python修改xml
EN

Stack Overflow用户
提问于 2015-12-01 06:43:34
回答 1查看 113关注 0票数 0

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

xml_screenshot

代码语言:javascript
复制
<?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"
/>

代码语言:javascript
复制
<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将旧版本3.0.10.4的sparkle:状态从"live“更改为"expired”。这个xml稍后会被推送到S3。我是python的新手,因此想知道如何实现它。我甚至可以创建一个全新的jenkins作业来获取这个xml并对其进行修改,然后将其推送到S3。任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-12-01 10:49:06

考虑使用lxml包的XSLT解决方案,其中可以避免XPath解决方案可能需要的遍历所有元素的任何循环。这里的脚本运行身份转换,以按原样复制所有节点和属性,然后专门在属性集@sparkle:version='3.0.10.4'中其同级所在的属性@sparkle:status的所有实例上运行模板。还要注意,我必须在XSLT的头部中声明sparkle名称空间。

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

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34009393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档