批处理 - 删除XML文件中特定子项的父节

时间:2014-08-25 02:32:55

标签: xml batch-file

我正在尝试使用子标记中的字符串删除父节。

XML文件的部分(original.xml)

<Mods>
    <ModItem>
        <Name>296707746.sbm</Name>
        <PublishedFileId>296707746</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>294620323.sbm</Name>
        <PublishedFileId>294620323</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>295393216.sbm</Name>
        <PublishedFileId>295393216</PublishedFileId>
    </ModItem>
</Mods>

我需要删除匹配<Name>numbers.sbm</Name>代码的子代的父部分,如下所示:

<ModItem>
    <Name>294620323.sbm</Name>
    <PublishedFileId>294620323</PublishedFileId>
</ModItem>

产生这个:

<Mods>
    <ModItem>
        <Name>296707746.sbm</Name>
        <PublishedFileId>296707746</PublishedFileId>
    </ModItem>
    <ModItem>
        <Name>295393216.sbm</Name>
        <PublishedFileId>295393216</PublishedFileId>
    </ModItem>
</Mods>

我正在使用的当前代码:

FOR /f "tokens=1 delims=:" %%L in ('FINDSTR /n "<Name>294620323.sbm</Name>"      sandboxxml.txt ') do set /a line=%%L-2

BREAK> "%temp%\empty"

FC "%temp%\empty" "sandboxxml.txt" /lb %line% /t | MORE +4 |FINDSTR /b /e /v "*****" >temp.xml

(代码是来自不同主题的修改后的答案)

它将部分之前的所有内容添加到temp.xml

如何将原始文件的其余部分放入temp.xml,不包括已删除的部分?

是否有不同/更简单的方法来实现这一目标?

(这是我关于stackoverflow的第一个问题,对不起,如果我做错了什么!)

2 个答案:

答案 0 :(得分:1)

下面的批处理文件使用与您的示例相同的方法:

@echo off
setlocal 

for /F "delims=:" %%L in ('findstr /N "<Name>294620323.sbm</Name>" original.xml') do set /A start=%%L-1, end=%%L+2
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" original.xml') do (
   if %%a lss %start% echo(%%b
   if %%a gtr %end% echo(%%b
)) > new.xml

请注意,此方法仅适用于此文件,具有此特定格式。

答案 1 :(得分:1)

使用a hybrid JScript/Batch utility called REPL.BAT执行正则表达式搜索/替换stdin并将结果写入stdout,可以非常有效地使用单行程。它是纯脚本,适用于从XP开始的任何现代Windows机器。

<original.xml repl "[\s]*<ModItem>([\s\S](?!</ModItem>))*<Name>294620323.sbm</Name>[\s\S]*?</ModItem>" "" m >new.xml