Windows批处理文件,用于删除XML中的某些标记

时间:2014-10-15 11:27:27

标签: 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">
    <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>

3 个答案:

答案 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