0

非 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^> ^<^!--" エスケープする特別な方法はありますか?'!'

4

2 に答える 2

0

最初のコメントの前に開始コメントタグを挿入せず(最初に明示的に挿入してパッチを適用する)、ファイルの最後に非クローズの開始コメントタグを挿入するため、この方法は正しくありません。また、空の行は保持されません。以下のバッチファイルは、<book ...> </ book>タグの外側のテキストをコメントに正しく囲みます(サンプルデータで正常にテストされました)。

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

アントニオ

于 2013-02-27T08:09:56.660 に答える
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=はそうします。

于 2013-02-26T06:42:12.937 に答える