0

可以说我有这样的xml结构:

<list>
    <main id="1" name="asd1">
        <reward id="5">
            <set reward_id="32" value="5123" />
            <set reward_id="352" value="12" />
        </reward>
        <reward id="6">
            <set reward_id="72" value="666666" />
            <set reward_id="32" value="21" />
        </reward>
    </main>
</list>

而且我有 30 个这样的文件,其中包含更多行。我的问题是,我想从reward_id 为“32”的每个文件中删除每一行。一个接一个地做这件事需要几周时间。你知道任何可以处理我的问题的程序吗?

编辑:每一行的值都会改变,有时还有比这两个更多的属性。

4

2 回答 2

1

通过这个 xsl 转换可以轻松地从单个 xml 文件中删除:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="set[@reward_id='32']" />

</xsl:stylesheet>

此转换包含两个模板。第一个是简单地复制所有内容的身份转换。第二个为要跳过的数据定义了一个例外。这种事情在 xslt 中很常见。

为了将其应用到文件,您需要使用应用 xsl 的工具。我用来从命令行执行此操作的是 xsltproc,如果您使用的是 MacOS 或 Linux,它可能已经在您的系统上。如果没有,此页面将帮助您获得它。

当我编写上述转换时,我将其命名为 test.xsl 并将其应用于保存为 test.xml 的示例 xml。运行它

xsltproc test.xsl test.xml > testout.xml

生成了一个文件 testout.xml,其中包含:

<list>
    <main id="1" name="asd1">
        <reward id="5">

            <set reward_id="352" value="12"/>
        </reward>
        <reward id="6">
            <set reward_id="72" value="666666"/>

        </reward>
    </main>
</list>

要将其应用于一组文件,您可以创建一个 shell 脚本来遍历这些文件,并为每个文件应用一个与此类似的命令,但当然文件名会有所不同。

于 2012-08-14T11:35:40.213 回答
0

任何优秀的文本编辑器都可以使用xml 插件、搜索和替换以及正则表达式来解决问题。选择一个,掌握它。编程大神会奖励你丰厚的!

我目前选择的武器是Notepad++

作为替代方案,您可以使用命令行实用程序和 shell,例如PowerShell。学习曲线有点陡峭,但它也会带来自己的优势。

于 2012-08-13T14:42:30.437 回答