在XML文件上添加新行

时间:2016-02-17 16:51:14

标签: xml windows batch-file

我有一个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>

如何使用批处理脚本执行此操作?

3 个答案:

答案 0 :(得分:1)

replacer.bat

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