我有一个XML文件 我想用批处理脚本向XML添加一个新行。
xml文件的一个示例是:
<MyXML flag="0">
<MyRow Path="C:\a.txt" DisplayName="a"/>
<MyRow Path="C:\b.txt" DisplayName="b"/>
</MyXML>
运行批处理文件后:
:
<MyXML flag="0">
<MyRow Path="C:\a.txt" DisplayName="a"/>
<MyRow Path="C:\b.txt" DisplayName="b"/>
<MyRow Path="C:\c.txt" DisplayName="c"/>
</MyXML>
如何使用批处理脚本执行此操作?
答案 0 :(得分:1)
call replacer.bat "e?xml.txt" "</MyXML>" "\t<MyRow Path=\u0022C:\\c.txt\u0022 DisplayName=\u0022c\u0022/>\r\n</MyXML>"
e?
用于评估特殊字符,如新行,制表符等。使用引号转义符号。
虽然使用这样的jscript / batch hybrids可以使用xml解析器,但我还没有准备好使用脚本。
答案 1 :(得分:1)
最好将XML 解析为 XML,而不是将可预测格式的平面文本解析为hack和scrape。这是一个非常基本的批处理+ PowerShell混合脚本,它将准确演示您的要求。
<# : batch portion
@echo off
setlocal
set "xmlfile=test.xml"
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
: end batch / begin PowerShell #>
[xml]$xml = gc $env:xmlfile
$add = $xml.createElement('MyRow')
$add.setAttribute('Path', 'C:\c.txt')
$add.setAttribute('DisplayName', 'c')
$xml.MyXML.appendChild($add)
$xml.Save($env:xmlfile)
...或者如果您更喜欢批处理+ JScript混合:
@if (@CodeSection == @Batch) @then
@echo off
setlocal
set "xmlfile=test.xml"
cscript /nologo /e:JScript "%~f0" "%xmlfile%"
goto :EOF
@end // end batch / begin JScript
var xml = WSH.CreateObject('MSXML2.DOMDocument.6.0');
xml.load(WSH.Arguments(0));
var add = xml.createElement('MyRow');
add.setAttribute('Path', 'C:\\c.txt');
add.setAttribute('DisplayName', 'c');
xml.selectSingleNode('//MyXML[@flag=0]').appendChild(add);
xml.save(WSH.Arguments(0));
答案 2 :(得分:0)
此完整BAT 仅在xml不是 一行 时才有效。
即使我发现其他2个解决方案在所有情况下都更安全,我也发布了此代码。
@echo off
set "$File=test.xml"
set "$NewRow=MyRow Path="C:\c.txt" DisplayName="c"/"
set "$Balise=/MyXML"
(for /f "delims=" %%a in ('type "%$File%') do (
echo "%%a" | find /i "<%$Balise%" >nul && (
echo ^<%$NewRow%^>
echo ^<%$Balise%^>) || echo %%a
)
)>Output.xml
move "Output.xml" "%$File%
del "Output.xml" 2>nul