批量计划问题

时间:2015-06-17 23:16:56

标签: xml batch-file

我有一个读取xml文件的批处理程序。读取xml的程序运行正常。这是我的问题。

我的xml中有某些节点,我需要使用批量检查和更新。我在想循环命令可以工作,但不能绕过它。以下是检查和更新所需的xml节点示例:

 <carType>Truck</carType>
 <carColor>Blue</carColor>
 <carLocal>NES</carLocal>

让我们说xml最多有一百个这样的节点。我可以从批处理文件中提取“Truck”“Blue”和“NES”。我需要做的是用这些变量更新节点: NES BOR BAK

我还需要检查是否“卡车”不要在该字段中输入“BOR”或“BAK”。

以下是批次代码:

 REM Finds the Parent Nodes for /F "tokens=3 delims=<>" %%i in ('findstr "<carType" AST.txt') do echo %%i >>tags.txt 

REM Continue with this loop for other conditions within XML sheet

REM START THE RANDOM Trucks BOR or BAK
:Pname4 
Set thisa=%Random% 
If /i %thisa% GTR 3 goto 
Pname4 If /i %thisa% LSS 1 goto Pname4 
goto playername 
:playername 
If %thisa% == 1 set pnameaa=Truck 
If %thisa% == 2 set pnameaa=BOR
If %thisa% == 3 set pnameaa=BAK 
goto xmlstuff 
:xmlstuff echo(^<carType^>%pnameaa%^</carType^> 
echo(^<carColor^>%pnameaa%^</carColor^>
echo(^<carLocal^>%rpnameaa%^</carLocal^> 
)>my.xml 

非常感谢

1 个答案:

答案 0 :(得分:0)

您不清楚自己要做什么,XML文件的结构,值到哪里等等。在您的示例批处理代码中,您似乎将<carType><carColor>节点设置为相同的值,然后将<carLocal>设置为从未在任何位置设置的值(更不用说懒惰粘贴)代码在几个地方留下不正确的换行符)。您还声明随机值应为 NES BOR BAK ;但是您的代码会将随机值设置为卡车 BOR BAK 。你确定你已经完全决定了你想要发生的事情吗?不要偷懒。你可以比这更好。

尽管如此,我说我会发一个答案,所以我会。

将XML 解析和操作为 XML通常更优雅,而不是作为文本来刮擦和破解。这样你就不会依赖于预测你操纵的XML的格式(无论它是否被美化,丑化,缩小,等等)。为此,我建议您使用Windows Scripting Host并使用Microsoft.XMLDOM COM对象来操作XML DOM。

我在这里做了一个疯狂的猜测,猜测你真正想要改变的唯一值是<carLocal>,但<carType>是卡车,<carLocal>不应该&#39; t接受BORBAK的值。这也应该将每个<carType>文本节点值写入tags.txt

假设以下XML结构:

<xmlroot>
    <car>
        <carType>Truck</carType>
        <carColor>Blue</carColor>
        <carLocal>NES</carLocal>
    </car>
    <car>
        <carType>Sedan</carType>
        <carColor>Yellow</carColor>
        <carLocal>BOR</carLocal>
    </car>
    <car>
        <carType>Blimp</carType>
        <carColor>Silver</carColor>
        <carLocal>BOR</carLocal>
    </car>
</xmlroot>

以下批处理+ JScript混合示例应使用.bat扩展名保存。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

rem // Randomly generate either NES, BOR, or BAK
set /a idx = %RANDOM% * 3 / 32768 + 1
for /f "tokens=%idx%" %%I in ("NES BOR BAK") do set "repl=%%I"

rem // invoke JScript to update XML
cscript /nologo /e:JScript "%~f0" "test.xml" "%repl%" >tags.txt

goto :EOF
@end // end batch / begin JScript chimera

var DOM = WSH.CreateObject('Microsoft.XMLDOM'),
    args = { file: WSH.Arguments(0), repl: WSH.Arguments(1) };

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);
}

for (var d = DOM.selectNodes('//car'), i = 0; i < d.length; i++) {
    var car = {
        type: d[i].getElementsByTagName('carType')[0].childNodes[0],
        color: d[i].getElementsByTagName('carColor')[0].childNodes[0],
        local: d[i].getElementsByTagName('carLocal')[0].childNodes[0]
    };

    if (car.type.nodeValue != 'Truck' || !/(BOR|BAK)/.test(args.repl))
        car.local.nodeValue = args.repl;
    WSH.Echo(car.type.nodeValue);
}

DOM.save(args.file);

希望这会让你开始。如果您对特定命令的作用有疑问,我将很乐意回答。但我并不打算根据您的规范重写任何代码。我会把它留给你。