如何批量更新XML文件

时间:2013-06-18 20:02:08

标签: xml scripting xmlspy altova batching

我有一堆XML都符合相同的架构。我想批量编辑的特定元素只出现在每个XML文件中,并且在每个文件中都有相同的xPath。

e.g.  /Valid/HeaderInfo/SoftwareID

我想创建一个脚本/过程,以便我可以替换此特定元素的值(我相信它更准确地称为节点的文本值),并对文件夹中的所有XML文件执行更新。文件夹组。例如,现在它是:

<SoftwareID>12451245</SoftwareID>

我希望它是

<SoftwareID>53623745</SoftwareID>

代替。

我目前刚刚开始编程,以及一般学习XML数据 - 我需要一些关于如何开始的基本信息。最好的方法是什么?我有Altova XMLSpy,我知道它有一个脚本组件。但是,以特定的编程语言(我目前正在学习Visual Basic)这样做是否更合适?还是有一些其他软件可用于执行这些类型的批量更新?

任何能让我朝着正确方向前进的信息都会很棒!

谢谢!

更新(2013年6月26日)

XPath to FilingSoftwareId(和更新的元素名称)实际上是:

  ValidFiling/FilingHeader/FilingSoftwareId  

ValidFiling是XML文档的根。我使用了您提供的内容并进行了相应更新,但是当我在Altova XMLSpy中为XSL Transformation选择此XSL文件时,我的结果与原始XML文件重复。

当第二个包罗万象的模板应用于文档时,是否有可能将FilingSoftwareID的更新替换为原始值?

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
    <xsl:template match="/ValidFiling/FilingHeader/FilingSoftwareId">
        <FilingSoftwareId>
            <xsl:text>243523452345</xsl:text>
        </FilingSoftwareId>
    </xsl:template>
    <xsl:template match="node()|@*">
        <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

再次感谢!

1 个答案:

答案 0 :(得分:1)

我会编写一个identity-translate XSL,然后使用你想要的任何批处理技术将该XSL应用于该文件夹中的所有XML(如果你愿意,可以使用.bat,VB app)。为您想要更改的特定元素写一个匹配项,然后包含一个通用模板,按原样输出所有其他内容。

没有测试,它应该是这样的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="//Valid/HeaderInfo/SoftwareID">
    <SoftwareID>
        <xsl:text>53623745</xsl:text>
    </SoftwareID>        
</xsl:template>
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

您甚至可以扩展该示例以将新值作为参数传递到转换中,这样您就不必编辑它。