我需要为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平台首选。 谢谢!
答案 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吗?