如何搜索和替换10,000个XML文件的XML标记和条目

时间:2013-03-18 19:07:42

标签: xml windows macos xml-parsing

我需要为10,000多个文件更新XML。

我是一名新手程序员,所以我更愿意使用可以开箱即用的东西(现有解决方案?)。如果没有,我不怕学习和尝试新事物。我正在上大学的课程(编程逻辑)让我的脚湿透,但当然这不会立即产生结果。

所有文件都在自己的基于序列号的目录中。 每个文件名为83_XYZETC.xml

这些XML文件中的每一个都有两个标签/内容需要搜索并删除所有实例。

示例:

<mediaFile>
content 123
</mediaFile>

<image>
image info 123
</image>

我还需要在另一个标签中重新插入不同的标签/内容。 示例:

                  <track>
Need to insert>>  <action>UPDATE</action>
                  extra stuff etc 
                  more stuff
                  even more
                  </track>

最后,我需要在标签内输入一串文字,但最后还是 例如:

<right type="labelDownload">Y</right>
</track>

我很感激任何建议。 Windows平台首选。 谢谢!

2 个答案:

答案 0 :(得分:3)

XSLT允许您以与您的英文描述非常相似的形式表达您的转换规则。

您从一个模板规则开始,该模板规则显示“默认情况下,当您点击元素时,复制它并处理其子元素”:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

你想要mediaFile和图像元素的规则说“删除这个元素”(即,当你遇到它时,什么都不输出):

<xsl:template match="mediaFile | image"/>

对于track元素,如果我理解你的话,你想在开头和结尾添加一些标准内容:

<xsl:template match="track">
  <xsl:copy>
    <action>UPDATE</action>
    <xsl:apply-templates/>
    <right type="labelDownload">Y</right>
  </xsl:copy>
</xsl:template>

除了样板表xsl:stylesheet元素之外,还有样式表的全部内容。

然后您需要将它应用于10000输入文档。您可以使用ant执行此操作,但其他人可以使用shell脚本执行此操作,或者还有David Lee的xmlsh,它是用于XML处理的特殊shell类脚本语言,或者您可以更有进取心并使用XProc。或者你可以写一个小的Java应用程序。这真的取决于你最舒服的东西。但是如果你不想学习另一种语言,你也可以在XSLT 2.0中做到这一点,尽管它有点依赖于处理器。使用Saxon,您可以添加模板规则:

<xsl:template name="main">
  <xsl:for-each select="collection('.?select=*.xml')">
    <xsl:result-document href="{tokenize(document-uri(.), '/')[last()]">
      <xsl:apply-templates/>
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>

然后,安装了Saxon之后,您需要使用当前目录运行它,只需包含XML文件:

java net.sf.saxon.Transform -xsl:stylesheet.xsl -it:main -o:../output/result.xml

答案 1 :(得分:0)

你还看过XProc吗?