Windows批处理文件以删除XML中的某些标记
我有一个类似于下面的xml文件,我想在其中删除幻灯片的所有xml标记 包括它们的子元素,并使用windows保留父标记,如下所示 批处理文件。这方面有什么帮助吗 现有代码:Windows批处理文件以删除XML中的某些标记,xml,batch-file,Xml,Batch File,我有一个类似于下面的xml文件,我想在其中删除幻灯片的所有xml标记 包括它们的子元素,并使用windows保留父标记,如下所示 批处理文件。这方面有什么帮助吗 现有代码: <?xml version="1.0" encoding="UTF-8"?> <slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly"> <slide type="all">
<?xml version="1.0" encoding="UTF-8"?>
<slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly">
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
<slide type="all">
<title>Overview</title>
<item>
Why
<em>WonderWidgets</em>
are great
</item>
<item/>
<item>
Who
<em>buys</em>
WonderWidgets
</item>
</slide>
</slideshow>
醒醒吧!
概述
为什么?
WonderWidgets
很好
谁
买
WonderWidgets
所需代码
<?xml version="1.0" encoding="UTF-8"?>
<slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly">
</slideshow>
试试这个:
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET SKIP=FALSE
SET NEEDLE=slideshow
FOR /f "tokens=*" %%i IN (input.xml) DO (
IF !SKIP! EQU FALSE ECHO %%i
SET INPUT=%%i
SET DATA=!INPUT:~1,9!
IF !DATA! EQU !NEEDLE! SET SKIP=TRUE
SET DATA=!INPUT:~2,9!
IF !DATA! EQU !NEEDLE! SET SKIP=FALSE
)
IF !SKIP! EQU FALSE ECHO !INPUT!
ENDLOCAL
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“打印=1”
(
对于/f“usebackq delims=“%%a in”(“input.xml”)
)do for/f“tokens=1 delims=/”中的%%b(“%%a”
)如果/i“%%~b”==“幻灯片”,则执行此操作(
如果已定义打印(设置“print=”)否则(设置“print=1”)
)如果已定义,则为else打印回显(%%a
)>“output.xml”
它只读取行中的第一个标记,该标记用作开关,以确定行是否必须写入输出。您确实应该使用为处理XML而构建的工具 但是,使用在stdin上执行正则表达式搜索/替换并将结果写入stdout的方法来提供解决方案并不太困难。REPL.BAT是从XP开始在任何Windows机器上本机运行的纯脚本 使用REPL.BAT的解决方案将比任何纯批量解决方案更健壮、速度更快 如果没有缩写的空幻灯片标签(无
或
),则以下操作应有效:
键入input.xml | repl“\s*]*)?>([\s\s](?!)*[\s\s]”m>output.xml
如果可能有缩写的空幻灯片标签,那么以下更复杂的正则表达式应该可以工作:
键入input.xml | repl“\s*]*?)?/>(\s[^>]*)?>([\s\s](?!)*[\s\s])“”“m>output.xml
您的努力如何?对不起,Abhi,我不熟悉关于XML文件的批量脚本编写,所以发布在这里。感谢您的指导
@echo off
setlocal enableextensions disabledelayedexpansion
set "print=1"
(
for /f "usebackq delims=" %%a in ("input.xml"
) do for /f "tokens=1 delims=/<> " %%b in ("%%a"
) do if /i "%%~b"=="slide" (
if defined print (set "print=") else (set "print=1")
) else if defined print echo(%%a
) > "output.xml"