批处理文件中的XML操作

时间:2013-02-26 06:38:22

标签: windows batch-file

我有一个XML文件,应该通过为非XML标记中的项添加注释来很好地格式化。示例输入文件如下所示。

comment 1
<book id=1>
    Book 1
</book>

comment 2
<book id=2>
    Book 2
</book>

comment 3
<book id=3>
    Book 3
</book>

预期输出

<!-- comment 1 -->
<book id=1>
    Book 1
</book>

<!-- comment 2 -->
<book id=2>
    Book 2
</book>

<!-- comment 3 -->
<book id=3>
    Book 3
</book>

书面批处理脚本。

@ECHO off
SETLOCAL enabledelayedexpansion

SET INTEXTFILE=test.xml
SET OUTTEXTFILE=out.xml

SET "SEARCH_TEXT_1=^<book "
SET "REPLACE_TEXT_1=--^> ^<book "

SET "SEARCH_TEXT_2=^</book^>"
SET "REPLACE_TEXT_2=^</book^> ^<^!--"

SET "comment=<^!--- Converted to well formed XML --> <^!--"
ECHO !comment! > %OUTTEXTFILE%

for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
    SET string=%%A
    SET modified=!string:%SEARCH_TEXT_1%=%REPLACE_TEXT_1%!
    SET modified=!modified:%SEARCH_TEXT_2%=%REPLACE_TEXT_2%!
    ECHO !modified! >> %OUTTEXTFILE%
)

错误:

< was unexpected at this time.

这是由于行'!'中的SET "REPLACE_TEXT_2=^</book^> ^<^!--",是否有任何特殊方法可以转义'!'符号?

2 个答案:

答案 0 :(得分:0)

您需要引用set s:

SET "string=%%A"
SET "modified=!string:%SEARCH_TEXT_1%=%REPLACE_TEXT_1%!"
SET "modified=!modified:%SEARCH_TEXT_2%=%REPLACE_TEXT_2%!"

否则源中会有未加引号且未转义的><被解释为重定向,这是您不想要的。

但结果看起来不太合适:

<!--- Converted to well formed XML --> <!-- 
comment 1--
<book id=1>--
    Book 1--
</book>--
...

此外,您使用delims=¶有什么理由吗?你真的在期待输入中有个字符吗?或者只是不使用分隔符?在后一种情况下,delims=就是这样做的。

答案 1 :(得分:0)

您的方法不正确,因为它没有在第一个注释之前插入开始注释标记(您通过在开头显式插入它来修补),并在文件末尾插入一个未关闭的开始注释标记;另外,它不会保留空行。下面的批处理文件正确地包含&lt; book ...&gt;之外的任何文本。 &lt; / book&gt; 标记到评论中(使用您的示例数据成功测试):

@echo off
setlocal DisableDelayedExpansion
set bang=!
setlocal EnableDelayedExpansion

set inFile=test.xml
set outFile=out.xml

set "startLine=<book "
set startLen=6
set "endLine=</book>"

echo ^<!bang!--- Converted to well formed XML --^> > %outFile%

set inBook=
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %inFile%') do (
   set string=
   set "string=%%b"
   if not defined string (
      echo/
   ) else (
      if "!string:~0,%startLen%!" equ "%startLine%" (
         set inBook=true
      )
      if not defined inBook (
         echo ^<!bang!-- !string! --^>
      ) else (
         echo !string!
         if "!string!" equ "%endLine%" (
            set inBook=
         )
      )
   )
)) >>  %outFile%

安东尼奥

相关问题