2016-02-17 4 views
3

У меня есть XML-файл.
Я хочу добавить новую строку в 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> 

Как я могу сделать это с пакетного сценария?

ответ

1

Лучше разобрать XML как XML, а не как предсказуемо отформатированный плоский текст для взлома и царапины. Вот очень простой пакетный гибридный скрипт 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)); 
+0

Да, лучше. – npocmaka

+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? для оценки специальных символов, таких как новые линии, закладками и так on.Qor котировки используются Юникода ускользает. Хотя с такими jscript/batch-гибридами можно использовать синтаксические анализаторы xml, у меня нет готовых к использованию скриптов.

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 
+0

@SacheDee, я пытаюсь запустить .bat-файл, но я получил ошибку «| был в настоящее время неактивен» –