从xml中删除多行

时间:2012-08-13 14:39:35

标签: xml lines

假设我有这样的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”的文件的每一行。一个接一个地执行此操作需要数周时间。你知道任何能解决我问题的程序吗?

编辑:每行更改一次值,有时候还有更多属性而不仅仅是那两行。

2 个答案:

答案 0 :(得分: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,则可能已经在您的系统上。如果不是this page将帮助您获得它。

当我编写上述转换时,我将其命名为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脚本来浏览文件,并为每个文件应用与此类似的命令,但当然文件名不同。

答案 1 :(得分:0)

任何优秀文本编辑器都可以使用 xml插件,搜索和替换以及正则表达式来实现这一目标。选择一个,掌握它。编程之神会非常奖励你!

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

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