1

我有一堆符合相同模式的 XML。我要批量编辑的特定元素仅在每个 XML 文件中出现一次,并且在每个文件中具有相同的 xPath。

e.g.  /Valid/HeaderInfo/SoftwareID

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

<SoftwareID>12451245</SoftwareID>

我希望它是

<SoftwareID>53623745</SoftwareID>

反而。

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

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

谢谢!

更新 (06/26/13)

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

  ValidFiling/FilingHeader/FilingSoftwareId  

ValidFiling 是 XML 文档的根。我使用了您提供的内容并进行了相应更新,但是当我在 Altova XMLSpy 中选择此 XSL 文件进行 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>

再次感谢!

4

1 回答 1

1

我会编写一个身份转换 XSL,然后使用您希望使用的任何批处理技术(.bat、VB 应用程序,如果您愿意)将该 XSL 应用于该文件夹中的所有 XML。为您希望更改的特定元素或元素编写匹配项,然后包含一个通用模板,该模板按原样输出所有其他内容。

未经测试,它应该是这样的:

<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>

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

于 2013-06-18T20:57:37.253 回答