我有一个读取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
非常感谢
答案 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接受BOR
或BAK
的值。这也应该将每个<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);
希望这会让你开始。如果您对特定命令的作用有疑问,我将很乐意回答。但我并不打算根据您的规范重写任何代码。我会把它留给你。