使用批处理文件使用通用标记解析XML

时间:2015-09-15 19:31:52

标签: xml batch-file

第一篇文章,很抱歉,如果这是重复。在环顾四周之后,我找不到任何符合我需要的预先答案。

我需要构建一个可以解析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

2 个答案:

答案 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%"