Python 和 XML:更新特定值

问题描述 投票:0回答:1

我必须处理一些 XML 文件,与我在教程中看到的相比,它的解析看起来很奇怪。

    <A>
       <B>
          <C>text<C>
          <D>text2<D>
          <E a=v1 b=v2>
             <F>v3</F>
          </E>
       </B>
   </A>

如何修改v1、v2、v3的值?

python-3.x xml elementtree
1个回答
1
投票

这是使用 XSLT 的方法。

它正在使用所谓的Identity Transform模式。

我必须修复 XML 示例以使其 格式良好

  • 打开和关闭 XML 元素不匹配。
  • 属性值未用引号引起来。

输入 XML

<A>
    <B>
        <C>text</C>
        <D>text2</D>
        <E a="v1" b="v2">
            <F>v3</F>
        </E>
    </B>
</A>

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" encoding="utf-8"
                omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="v1" select="'v1_new'"/>
    <xsl:param name="v2" select="'v2_new'"/>
    <xsl:param name="v3" select="'v3_new'"/>

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

    <xsl:template match="E/@a">
        <xsl:attribute name="a">
            <xsl:value-of select="$v1"/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="E/@b">
        <xsl:attribute name="b">
            <xsl:value-of select="$v2"/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="F/text()">
        <xsl:value-of select="$v3"/>
    </xsl:template>
</xsl:stylesheet>

输出 XML

<A>
  <B>
    <C>text</C>
    <D>text2</D>
    <E a="v1_new" b="v2_new">
      <F>v3_new</F>
    </E>
  </B>
</A>

蟒蛇

import os
import lxml.etree as ET

inputfile = "D:\\temp\\input.xml"
xsltfile = "D:\\temp\\process.xslt"
outfile = "D:\\output\\output.xml"

dom = ET.parse(inputfile)
xslt = ET.parse(xsltfile)
transform = ET.XSLT(xslt)
newdom = transform(dom,
              v1=XSLT.strparam("bk101"),
              v2=XSLT.strparam("New Author"))
infile = unicode((ET.tostring(newdom, pretty_print=True)))
outfile = open(outfile, 'a')
outfile.write(infile)
© www.soinside.com 2019 - 2024. All rights reserved.