【问题标题】:Remove multiple lines from xml从 xml 中删除多行
【发布时间】:2012-08-13 14:39:34
【问题描述】:

假设我有这样的 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”的每个文件中删除每一行。一个接一个地做这件事需要几周时间。你知道有什么程序可以解决我的问题吗?

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

【问题讨论】:

  • 你是程序员吗?然后你可以用命令行来做一些事情并保存为 BAT 文件。
  • 我只是在用 Java 编程,创建可以删除这些行的代码对我来说需要时间:/
  • 啊,太糟糕了。不幸的是,我不知道有任何开箱即用的免费工具可以做你想做的事情。
  • 如果您事先知道它们都可以具有哪些值,则可以进行“查找和替换”。但是您是否事先知道 reward_id="32" 的所有可能值?
  • 不,有无限可能的值,所以我可能必须在 java 中创建工具,或者在将这些 XML 文件加载到我的程序时,跳过奖励 ID 为 32 的行并将文件保留原样是:)

标签: xml lines


【解决方案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 脚本来遍历文件,并为每个文件应用与此类似的命令,但文件名当然会有所不同。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果线条有些动态,则查找和替换将不起作用。您可以替换静态部分,但您想用空字符串替换整行,动态部分也是如此。
    猜你喜欢
    • 2021-09-13
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2023-01-16
    • 2016-12-10
    • 2017-03-04
    • 1970-01-01
    相关资源
    最近更新 更多