我有一个类似于下面的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">
<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>
必填代码
<?xml version="1.0" encoding="UTF-8"?>
<slideshow title="Sample Slide Show" date="Date of publication" author="Yours Truly">
</slideshow>
答案 0 :(得分:1)
@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"
它只是读取行中的第一个标记,用作开关来确定是否必须将行写入输出。
答案 1 :(得分:0)
试试这个:
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
答案 2 :(得分:0)
您确实应该使用为处理XML而构建的工具。
但是使用在{stdin上执行正则表达式搜索/替换的hybrid JScript/batch utility called REPL.BAT并将结果写入stdout来提供解决方案并不困难。 REPL.BAT是纯脚本,可以在任何Windows机器上从XP开始本地运行。
使用REPL.BAT的解决方案将比任何纯批量解决方案更加强大和快速。
如果没有缩写的空幻灯片标签(没有<slide\>
或<slide attribute="value"/>
),则以下内容应该有效:
type input.xml|repl "\s*<slide(\s[^>]*)?>([\s\S](?!</slide>))*[\s\S]</slide>" "" m >output.xml
如果可能有缩写的空幻灯片标签,则以下更复杂的正则表达式应该有效:
type input.xml|repl "\s*<slide((\s[^>]*?)?/>|(\s[^>]*)?>([\s\S](?!</slide>))*[\s\S]</slide>)" "" m >output.xml