Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
vavun
10493 / 5457 / 859
Регистрация: 07.04.2013
Сообщений: 15,663
1

Объединение нескольких xml (ну или патч xml)

10.05.2018, 18:39. Просмотров 1130. Ответов 6
Метки нет (Все метки)

Приветствую !

Есть необходимость внести изменения в ряд xml файлов в автоматическом режиме.
Допустим исходный xml
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="somename1">anyvalue8</string>
    <string name="somename2">anyvalue7</string>
    <string name="somename3">anyvalue6</string>
    <string name="somename4">anyvalue5</string>
    <string name="somename5">anyvalue4</string>
    <string name="somename6">anyvalue3</string>
    <string name="somename7">anyvalue2</string>
    <string name="somename8">anyvalue1</string>
</resources>
Нужно в него добавить
XML
1
2
    <string name="mystring1">myvalue2</string>
    <string name="mystring2">myvalue1</string>
Чтобы вышло примерно
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="somename1">anyvalue8</string>
    <string name="somename2">anyvalue7</string>
    <string name="somename3">anyvalue6</string>
    <string name="somename4">anyvalue5</string>
    <string name="somename5">anyvalue4</string>
    <string name="somename6">anyvalue3</string>
    <string name="somename7">anyvalue2</string>
    <string name="somename8">anyvalue1</string>
    <string name="mystring1">myvalue2</string>
    <string name="mystring2">myvalue1</string>
</resources>
тоесть чтобы добаляемые строки попали секцию <resources>, а не лишь бы куда.

так же нужно имет ьвозможность выбранной секции заменить, к примеру
XML
1
    <bool name="whatever">false</bool>
на
XML
1
    <bool name="whatever">true</bool>
В общем нужно или решение с использованием cygwin или консольная утиль специально для этого предназначенная.
Posh не предлагать

Заранее спасибо
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2018, 18:39
Ответы с готовыми решениями:

Объединение нескольких XML файлов
есть папка, где хранится неизвестное число файлов *.xml. нужно объединять в один файл части пяти...

Объединение 2 xml файлов по ключу в 1 xml с использованием linq
День добрый. Я уже отписывался в другой теме с объединением 2 xml, но увы тот метод для меня...

LINQ to XML или XPath to XML (выбор одного элемента)
Прошу помощи в LINQ или XPath запросе к XML Вот XML: &lt;manifest...

Пропарсить и стандартизировать XML, XSL или Linq to XML?
Такой вопрос. необходимо считывать XML-файлы и приводить их к единому стандарту руководствуясь...

Ко всем файлам добавилось .xml, теперь они в формате ***.xls.XML, ***doc.XML (изначально в Word и Excel)
при копировании с одного ноутбука на другом (изначально на новом не было офиса, м.б. из-за этого...

6
bidstrup
334 / 150 / 23
Регистрация: 11.03.2018
Сообщений: 656
10.05.2018, 19:13 2
Цитата Сообщение от vavun Посмотреть сообщение
или консольная утиль специально для этого предназначенная
xmlstarlet
0
vavun
10493 / 5457 / 859
Регистрация: 07.04.2013
Сообщений: 15,663
10.05.2018, 19:15  [ТС] 3
Цитата Сообщение от bidstrup Посмотреть сообщение
xmlstarlet
находил гугле, но так и не разобрался, как делать то, что нужно
0
bidstrup
334 / 150 / 23
Регистрация: 11.03.2018
Сообщений: 656
10.05.2018, 19:25 4
Он непростой, согласен.
На мой взгляд pwsh более интуитивно понятен, но почему-то отвергнут.

Если вдруг случайно установлена JRE, то можно через xquery сделать.
0
vavun
10493 / 5457 / 859
Регистрация: 07.04.2013
Сообщений: 15,663
10.05.2018, 19:28  [ТС] 5
Цитата Сообщение от bidstrup Посмотреть сообщение
Если вдруг случайно установлена JRE, то можно через xquery сделать.
установлена. Как это будет выглядеть примерно ?
0
bidstrup
334 / 150 / 23
Регистрация: 11.03.2018
Сообщений: 656
11.05.2018, 10:18 6
Лучший ответ Сообщение было отмечено vavun как решение

Решение

ох, давно это было... минут через 20 освобожусь, попытаюсь оценить, что в конечном итоге проще
xmlstarlet или на java+xquery.

можно ещё спросить на ветке xml, там хорошие ребяты )

Добавлено через 2 часа 15 минут
утилиту xmlstarlet я оценил как решение в целом попроще, чем xquery.


добавить подузел 'string' со значением NEW_VALUE и атрибутом name со значением NEW_NAME в узел 'resources':

Windows Batch file
1
xmlstarlet ed --subnode "/resources" --type elem -n string -v NEW_VALUE -i '/resources/string[text()="NEW_VALUE"]' --type attr -n name -v NEW_NAME  myfile.xml
тут сложность в синтаксисе в том, что сначала добавляется просто подузел без атрибутов ( --subnode --type elem ),
а затем уже в него вставляются атрибуты ( --insert --type attr )


заменить значение узла resources/string с атрибутом name="mystring1" на NEW_VALUE:

Windows Batch file
1
xmlstarlet ed --update 'resources/string[@name="mystring1"]' -v NEW_VALUE myfile.xml


Примечание: возможно под ком.строку Windows понадобится поменять местами одинарные и двойные кавычки,
я проверял только под Linux.

Добавлено через 12 часов 23 минуты
Исправление:
Пожалуй, стоит поменять критерий изменения только что вставленного узла.
Вместо сравнения значения узла, лучше воспользоваться встроенными в XPath функциями position() и last()
Windows Batch file
1
xmlstarlet ed --subnode "/resources" --type elem -n string -v NEW_VALUE --insert '/resources/string[position()=last()]' --type attr -n name -v NEW_NAME  myfile.xml
2
greg zakharov
Покинул форум
2401 / 991 / 281
Регистрация: 07.05.2015
Сообщений: 1,991
11.05.2018, 11:16 7
Лучший ответ Сообщение было отмечено vavun как решение

Решение

Цитата Сообщение от vavun
В общем нужно или решение с использованием cygwin или консольная утиль специально для этого предназначенная.
В случае просто утилит первое что приходит на ум - sed. Вставка узла в xml для задачи выше можно представить как:
Windows Batch file
1
sed -i "/<\/resources>/ s/.*/    <string name=""mystring1"">myvalue2<\/string>\n&/" my.xml
Совершенно очевидно, что sed способен вносить правки в любом месте документа, а потому в вопросе о "секции" неясным остается лишь критерии поиска, так как узел может дублироваться.
Относительно xmlstarlet уже было упомянуто, поэтому, наверное, упоминание о нем здесь будет лишним.
В Cygwin для разбора xml можно использовать сценарии bash, Perl, Ruby, Python, Tcl, Lua, awk - выбор очень велик. Можно, к слову, использовать Vim (есть плагин для разбора и правки xml). Приводить же примеры для каждого из упомянутых и накладно, и оффтоп.
2
11.05.2018, 11:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2018, 11:16

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

MetaBase.xml или metaname.XML ?
Захотел увеличить разрешённый размер файлов для закачки aspSmartUpload. В инструкции на инсталяцию...

объединение xml
Здравствуйте, пробую вставить созданный элемент group в существующий xml файл. по отдельности...

Неверное объединение XML файлов
итак, нужно брать из одной папки по 5 xml файлов, имя которых начинается не на &quot;!&quot;, объединять их и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.