用于编辑XML并保留格式和注释的Python库

7 投票
2 回答
1072 浏览
提问于 2025-04-16 20:37

我需要对现有的XML文件做一些修改,但要保持原有的格式和注释——除了我做的小改动,其他的都不能动。我试过用xml.etree和lxml.etree,但都没成功。

这些XML是我的开发环境生成的,但它的编辑器功能不够强大,所以我得手动做一些改动。我想保持格式,这样对比的时候看起来会更好,不会污染我的历史记录。

考虑到有很多Python的XML库,我想在这里问问有没有人做过类似的事情。

2 个回答

-2

你需要做多少改动,改什么呢?听起来你可能更适合直接使用一个独立的XML编辑器(你可以在网上搜一下,有很多这样的工具)。说实话,我有点惊讶你的开发环境(IDE)没有满足你需求的搜索和替换功能。(我见过的大多数开发环境都有正则表达式的功能。)如果你真的需要写个程序来修改XML,而且又不想搞乱格式和注释,最好的办法可能是用Python把XML当作普通文本文件打开,然后用它的正则表达式库(import re)来进行搜索和替换。

0

我们来聊聊 XSLT,这是一种专门用来转换XML文件的语言。简单来说,使用它的身份转换功能,你可以保持XML文件的原样,同时对文本内容进行一些小的调整或者直接删除。Python中的 lxml 库可以运行XSLT,或者Python也可以调用一些外部处理器,比如Xalan和Saxon。

下面的内容演示了如何更新一个已有节点的文本内容,或者根据值完全删除一个节点。

XSLT (保存为 .xsl 文件)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8"/>
    
    <!-- IDENTITY TRANSFORM -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- ADJUST NODE CONTENT -->
    <xsl:template match="key[text()='value']">
       <xsl:copy>
          <xsl:text>new value</xsl:text>
       </xsl:copy>
    </xsl:template>

    <!-- EMPTY TEMPLATE TO REMOVE NODE -->
    <xsl:template match="key[text()='value']"/>
</xsl:stylesheet>

Python

import lxml.etree as lx

# PARSE XML AND XSLT
doc = lx.parse("input.xml")
style = lx.parse("style.xsl")

# CONFIGURE AND RUN TRANSFORMER
transformer = lx.XSLT(style)
result = transformer(doc)

# OUTPUT TO FILE
result.write_output("output.xml")

撰写回答