2013-02-26 165 views
0

我有一个XML文件,应该通过为非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^> ^<^!--"'!'是否有逃避'!'符号的任何特殊的方式?

回答

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=会这样做。

+0

delims =¶是假的一。更改为delims = – 2013-02-26 06:47:03

0

您的方法不正确,因为它没有在第一条评论(即您在开始时显式插入它进行修补)之前插入开始注释标记,并在文件末尾插入未封闭的开始注释标记;此外,它不保留空行。下面的批处理文件正确地包围任何文本之外<书... > < /书>标记为注释(与您的示例数据测试成功):

@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% 

安东尼