BATCH脚本将返回字符插入XML文件

时间:2015-06-05 19:31:02

标签: xml batch-file xml-parsing

我需要使用批处理脚本从没有任何返回字符的XML文件中解析一些信息。我的策略是复制XML文件并插入正确的返回字符,然后解析出我需要的行。目标是在'><'之间插入一个返回字符字符。

XML文件示例:

<NOUNS><thing 1>hammer</thing 1><person>The Stig</person></NOUNS>

2 个答案:

答案 0 :(得分:1)

以下解决方案会删除包含通配符*?的字段。如果字段中包含引号,它也可能会失败。

@echo off
setlocal EnableDelayedExpansion

set "part="
call :ProcessFile < file.xml > fileWithNL.xml
goto :EOF

:ProcessFile
   set "line="
   set /P "line="
   set "line=!part!!line!"
   if not defined line exit /B

   for %%a in ("!line:><=>" "<!") do (
      set "part=%%~a"
      if "!part:~-1!" equ ">" (
         echo !part!
         set "part="
      )
   )
goto ProcessFile

编辑添加了新的混合方法

下面的新解决方案是Batch-JScript混合脚本,它比以前的纯Batch解决方案更有效,并且没有其局限性。将代码复制到扩展名为.bat的文件中。

@set @a=0  /*
@cscript //nologo //E:Jscript "%~F0" < file.xml > fileWithNL.xml
@goto :EOF */

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/></g,">\r\n<"));

答案 1 :(得分:0)

使用.bat扩展名保存它。它接受一个参数 - xml文件:

0</* :
@cscript /nologo /E:jscript "%~f0" %*
@goto :EOF
*/0;

var FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
if (ARGS.Length < 1 ) {
 WScript.Echo("No file passed");
 WScript.Quit(1);
}
var filename=ARGS.Item(0);

var readStream=FSOObj.OpenTextFile(filename, 1);

var content=readStream.ReadAll();
readStream.Close();

function replaceAll(find, replace, str) {
  return str.replace(new RegExp(find, 'g'), replace);
}

var newConten=replaceAll("><",">\r\n<",content);

var writeStream=FSOObj.OpenTextFile(filename, 2);
writeStream.WriteLine(newConten);
writeStream.Close();