我正在尝试使用子标记中的字符串删除父节。
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的第一个问题,对不起,如果我做错了什么!)
答案 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