我需要使用批处理脚本从没有任何返回字符的XML文件中解析一些信息。我的策略是复制XML文件并插入正确的返回字符,然后解析出我需要的行。目标是在'><'之间插入一个返回字符字符。
XML文件示例:
<NOUNS><thing 1>hammer</thing 1><person>The Stig</person></NOUNS>
答案 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();