我有一个要读取的XML文件,以及我已经解析过的某些节点。这是一个例子:
<goingTo>RNS</goingTo>
<goingTo>HTY</goingTo>
从XML文件中提取的cmd代码如下所示:
for /F "tokens=3 delims=<>" %%i in ('findstr "<goingTo>" AST.xml') do echo %%i >>To_Places.txt
这一切都很好,结果是:
RNS
HTY
在我的To_Places.txt
文件中。
同样在我的XML中,我试图解析并添加条件语句,但我很难用它。
在我的XML文件中,我必须遍历文件以检查是否加载了某些内容或为空。
XML中节点的片段:
<VehWeight>14.878</VehWeight>
<VehWeight>4.98</VeWeight>
我需要批处理代码来浏览XML文件,阅读VehWeight
数据并执行GTR 14 = Load
或LSS 14 = MTY
。然后将此输出添加到附加到To_Places.txt
文件的文本文件中。
批量有这样的方式吗?
答案 0 :(得分:1)
在阅读或操作XML时,最好将视为结构化XML,而不是试图将其作为带有标记分隔符或正则表达式的文本进行破解和删除。这样,无论XML是美化还是丑化,它仍然有效。
我喜欢将JScript用于此类事情。在.bat文件中包含混合代码非常容易,它可以轻松处理文档对象模型导航(就像JavaScript一样)。
使用.bat扩展名保存并运行它。看看它是否能为您提供所期望的结果。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "XMLfile=AST.xml"
set "outfile=To_Places.txt"
cscript /nologo /e:JScript "%~f0" "%XMLfile%" "%outfile%" && echo Done.
goto :EOF
@end // end batch / begin JScript chimera
var fso = WSH.CreateObject('Scripting.FileSystemObject'),
DOM = WSH.CreateObject('Microsoft.XMLDOM'),
args = { xmlfile: WSH.Arguments(0), outfile: WSH.Arguments(1) };
DOM.load(args.xmlfile);
DOM.async = false;
DOM.setProperty('SelectionLanguage', 'XPath');
if (DOM.parseError.errorCode) {
var e = DOM.parseError;
WSH.StdErr.WriteLine('Error in ' + args.xmlfile + ' line ' + e.line + ' char '
+ e.linepos + ':\n' + e.reason + '\n' + e.srcText);
WSH.Quit(1);
}
var out = fso.CreateTextFile(args.outfile, 1);
for (var d = DOM.selectNodes('//goingTo/text()'), i = 0; i < d.length; i++)
out.WriteLine(d[i].nodeValue);
for (var d = DOM.selectNodes('//VehWeight/text()'), i = 0; i < d.length; i++)
out.WriteLine(d[i].nodeValue * 1 < 14 ? 'MTY' : 'LOAD');
out.Close();