2015-03-25 2 views
0

Я использую версию xmlstarlet для обновления файла xml через пакетный файл Windows.Как обновить xml-файл с помощью xmlstarlet

xml edit --update "/xml/table/rec[@id=3]/@id" --value 10 %xmlfile% 

Я ожидал, чтобы обновить идентификатор атрибута НОЦ узла 10. Когда я запускаю это я вижу обновленный XML, как ожидается, в командной строке, но файл никогда не обновляется.

Как я могу это сделать, я хочу остаться в стороне от перезаписи всего файла, так как файл может быть большим.

перед обновлением:

<?xml version="1.0"?> 
<xml> 
    <table> 
    <rec id="1" /> 
    <rec id="2" /> 
    <rec id="3" /> 
    </table> 
</xml> 

после обновления:

<?xml version="1.0"?> 
<xml> 
    <table> 
    <rec id="1" /> 
    <rec id="2" /> 
    <rec id="10" /> 
    </table> 
</xml> 
+1

большинство инструментов оболочки не поддерживают обновление данных inplace.For например, 'СЭД - i' (inplace) по-прежнему записывает данные на новое место на диске, а затем удаляет старый файл. Я думаю, что то же самое верно и для XML-инструментов. Я был бы действительно удивлен, если 'xmlstarlet' работает по-другому. Удачи. – shellter

+0

Пожалуйста, покажите документ XML до и после этого обновления. –

+0

@ Mathias Я, безусловно, согласен с вами в принципе, что хорошо показывать входные данные, но проблема здесь заключается в редактировании на месте. Файл '

' достаточно, чтобы воспроизвести проблему - атрибут 'id' изменен, но вывод печатается в stdout, а не обратно в файл. –

ответ

9

Вы не показали свой входной документ, но я предполагаю, что это следующее, взятое из xmlstarlet documentation:

<xml> 
    <table> 
    <rec id="1"> 
     <numField>123</numField> 
     <stringField>String Value</stringField> 
    </rec> 
    <rec id="2"> 
     <numField>346</numField> 
     <stringField>Text Value</stringField> 
    </rec> 
    <rec id="3"> 
     <numField>-23</numField> 
     <stringField>stringValue</stringField> 
    </rec> 
    </table> 
</xml> 

xmlstarlet изменяет файл, но результат отправляется на стандартный вывод, не сохраняется в ori ginal файл. Используйте другой вариант --inplace изменить файл на месте:

$ xml ed --inplace -u "/xml/table/rec[@id='3']/@id" -v 5 rec.xml 

Тогда:

$ cat rec.xml 
<?xml version="1.0"?> 
<xml> 
    <table> 
    <rec id="1"> 
     <numField>123</numField> 
     <stringField>String Value</stringField> 
    </rec> 
    <rec id="2"> 
     <numField>346</numField> 
     <stringField>Text Value</stringField> 
    </rec> 
    <rec id="5"> 
     <numField>-23</numField> 
     <stringField>stringValue</stringField> 
    </rec> 
    </table> 
</xml> 

Кстати, этот вопрос, кажется, что-то спросить, очень похожий на this question.


EDIT: Как было предложено @npostavs, эта опция указан в редактировании справки:

$ xml edit --help 
... 
-L (or --inplace) - edit file inplace 
... 
+0

большое спасибо, mathias. это и сделал трюк. Я искал этот вариант и не мог найти его в api. как вы нашли это? – Schu

+0

@Schu Это действительно не часть документации, на мой взгляд. [Noam Postavsky вкратце упоминает, что он не поставлялся с начальным выпуском] (http://stackoverflow.com/a/18060194/1987598). –

+0

Он указан в 'xml edit --help' – npostavs

Смежные вопросы