我有一个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 :(得分: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%
安东尼奥