第一篇文章,很抱歉,如果这是重复。在环顾四周之后,我找不到任何符合我需要的预先答案。
我需要构建一个可以解析XML文件的批处理文件,该文件部分看起来像这样:
<parameter>
<name>description</name>
<value>something something</value>
</parameter>
<parameter>
<name>project</name>
<value>ProjectName</value>
</parameter>
<parameter>
<name>email group to notify</name>
<value>EmailGroup</value>
</parameter>
我想找到与&#34; Project&#34;相关联的值。参数。我能够得到“#34; Project&#34;使用下面的for
语句(:job
将其输出到没有<name>
标记的文本文件),但我无法弄清楚如何解析下一行的for /f "delims=" %%i in ('findstr /i /c:"<name>project</name>" output.xml') do call :job "%%i"
标记价值位于。
Col A Col B
1 Red
1 Red
2 Blue
2 Green
3 Black
答案 0 :(得分:1)
将XML作为XML进行解析和操作通常更为优雅,而不是作为文本进行刮擦和标记化。这样你就不会如此依赖于预测你正在操作的文件的格式 - 例如,标签中间的换行符。为此,我建议您使用Windows Scripting Host并使用Microsoft.XMLDOM
COM对象来操作XML DOM。
以下批处理+ JScript混合示例应使用.bat扩展名保存。
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "XMLfile=test.xml"
set "XPath=//name[contains(text(),'project')]/../value/text()"
for /f %%I in (
'cscript /nologo /e:Jscript "%~f0" "%XMLfile%" "/x:%XPath%"'
) do set "projectName=%%I"
echo %projectName%
goto :EOF
@end // end batch / begin JScript hybrid chimera
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
var DOM = WSH.CreateObject('Microsoft.XMLDOM'),
args = { file: WSH.Arguments(0), XPath: WSH.Arguments.Named('x') };
DOM.load(args.file);
DOM.async = false;
DOM.setProperty('SelectionLanguage', 'XPath');
if (DOM.parseError.errorCode) {
var e = DOM.parseError;
WSH.StdErr.WriteLine('Error in ' + args.file + ' line ' + e.line + ' char '
+ e.linepos + ':\n' + e.reason + '\n' + e.srcText);
WSH.Quit(1);
}
var node = DOM.documentElement.selectSingleNode(args.XPath);
WSH.Echo(node.data.trim());
答案 1 :(得分:0)
@echo off
setlocal
rem Get the number of the line with the "Project" parameter:
for /F "delims=:" %%i in ('findstr /N /I /C:"<name>project</name>" output.xml') do set "line=%%i"
rem Get the value of 3rd. token in next line:
for /F "skip=%line% tokens=3 delims=<>" %%a in (output.xml) do set "value=%%a" & goto continue
:continue
echo Value of Project: "%value%"
call :job "%value%"