The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Чтение и редактирование XML файла"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 12-Янв-19, 13:09 
Имеется конфиг файл xml-config.xml в формате XML:

<?xml version="1.0" encoding="UTF-8"?>
<zonelist>
        <domain name="domain01.com" admin="dns@domainadmin.com" ttl="1D" refresh="8H" retry="2H" expire="1W" negttl="60M">
                <record type="NS" value="ns1.domain01.com." />
                <record type="NS" value="ns2.domain01.com." />
                <record type="A" value="123.255.255.123" ttl="600" />
                <record type="A" domain="subdomain01" ttl="4H" value="123.255.255.255" />
                <record type="CNAME" domain="www" value="domain01.com." />
                <record type="MX" priority="10" value="mail1.server.com." />
                <record type="MX" priority="20" value="mail2.server.com." />
                <record type="MX" priority="30" value="mail3.server.com." />
                <record type="SPF" value="123.255.255.123,_spf.google.com" />
                <record type="TXT" value="This is a text record" />
        </domain>
        <domain name="domain02.net" admin="dns@domainadmin.com" ttl="1D" refresh="8H" retry="2H" expire="1W" negttl="60M">
                <record type="NS" value="ns1.domain02.net." />
                <record type="NS" value="ns2.domain02.net." />
                <record type="A" value="123.255.255.125" ttl="600" />
                <record type="A" domain="subdomain05" ttl="4H" value="123.255.255.255" />
                <record type="CNAME" domain="www" value="domain02.net." />
                <record type="MX" priority="10" value="mail1.server.com." />
                <record type="MX" priority="20" value="mail2.server.com." />
                <record type="MX" priority="30" value="mail3.server.com." />
                <record type="SPF" value="123.255.255.125,_spf.google.com" />
                <record type="TXT" value="This is a text record" />
        </domain>
</zonelist>

Нужно:
1) считать type="A" для домена domain02.net
2) ножно изменить IP для поддомена subdomain01.domain01.com


По пункту 1) остановился на:


echo 'cat zonelist/domain/record' | \
xmllint --shell  xml-config.xml | grep 'type="A"'

По пункту 2) кроме как sed не приходить в голову.

P.S. где бы еще про xmllint почитать примеры?
а то регэкспы вида:


echo 'cat zonelist/@*[name()="domain01.com" or name()="File"]' | \
    xmllint --shell  xml-config.xml
мне не понятны

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Чтение и редактирование XML файла"  +/
Сообщение от Аноним (1), 12-Янв-19, 15:19 
Такие вещи надо делать на нормальных скриптовых языках.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 12-Янв-19, 19:13 
> Такие вещи надо делать на нормальных скриптовых языках.

На каких, примеры?
А потом еще тянуть десятка два модулей-библиотек, чтоб нормально работать с XML файлами.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

2. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 12-Янв-19, 18:01 
xmllint --xpath '/zonelist/domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]' xml-config.xml

P.S. так а чем sed не устраивает?
grep subdomain01 xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 12-Янв-19, 19:18 
> xmllint --xpath '/zonelist/domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]'
> xml-config.xml

Это работает.

> P.S. так а чем sed не устраивает?

Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):


# xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]' -v 0 xml-config.xml
...
    <record type="A" value="123.255.255.123" ttl="600">0</record>
...


> grep subdomain01 xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'


sed -n '/<domain name="domain01.com"/,/<\/domain/p' xml-config.xml | sed '/domain="subdomain01"/s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

А вот тут нюанс, если поддомен subdomain01 будет у нескольких доменов, то получу несколько (чужих) IP.
Поэтому, надо через xmllint  сузить область обработки до нужного домена, а потом изменять через sed...
Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда sed сделает замену только один раз и не в том месте...

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Чтение и редактирование XML файла"  –1 +/
Сообщение от universite (ok), 12-Янв-19, 19:22 
дел.
Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 06:21 
> А вот тут нюанс, если поддомен subdomain01 будет у нескольких доменов, то

да что ж такое! опять эти грёбаные нюансы!
нюансы, нюансы.. никуда от них, короче, нюансы, да идут они в .о.у!
ну ты правильно понял, дорогой читатель - в воду!

> получу несколько (чужих) IP.

а вот это не надо, чужое - не трожь!

> Поэтому, надо через xmllint  сузить область обработки до нужного домена, а

ну так в чём же дело? сужаем?
сужаем!
xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml

> потом изменять через sed...

пожалуйста!

xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/1.1.1.1/'

> Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда
> sed сделает замену только один раз и не в том месте...

А! Нннадо ещё сужать!
(цепляем кавычки "")

xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]' xml-config.xml | sed 's/"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"/"1.1.1.1"/'

да, есть ещё xml_grep xml_merge xml_split

ну, что ещё?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

9. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 12:43 

>> Еще когда поддомен будет не subdomain01, а 2.2.2.2 (общий вид 2.2.2.2.domain01.com), тогда
>> sed сделает замену только один раз и не в том месте...
> А! Нннадо ещё сужать!
> (цепляем кавычки "")

у поддоменов тоже кавычки


domain="subdomain05"
domain="2.2.2.2"

> xmllint --xpath '/zonelist/domain[@name="domain01.com"]/record[@domain="subdomain01"]'
> xml-config.xml | sed 's/"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"/"1.1.1.1"/'
> да, есть ещё xml_grep xml_merge xml_split

Это в каких именно пакетах? :)


> ну, что ещё?

Т.е. полноценного фреймворка на все случаи c XML нет?

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

7. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 08:17 
> Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без
> проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):

эээ, "маладой челове-е-ек!", не пытайтесь нас обмануть!

ничего искать не надо, всё уже изобретено, прекрасно понимает и работает

садимся на велик и поехали?
да, едем!

(лирическое отступление)
подозреваю, что у ТС ОС BSD и, каюсь, у меня не было xmlstarlet (xml), пришлось установить

короче, я сделал за тебя домашку

hint:
чтобы менять нужно указывать что хотм менять, программа не телепат

так работает
xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123" and @ttl="600"]/@value' -v 0 xml-config.xml

и так тоже работает
xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/@value' -v 0 xml-config.xml

а так нет
xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/' -v 0 xml-config.xml

а так и вовсе неправильно
xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]' -v 0 xml-config.xml

подставляет в конце "0</record>" - то что и вовсе не требуется

ну и с заменой в субдомене аналогично

рабочие примеры
xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value' -v 0 xml-config.xml

xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value' -v 0 xml-config.xml

дарю
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html

такие дела..

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

10. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 12:50 
>> Хотелась бы найти утилиту-фреймворк, чтоб не только читать XML, а и без
>> проблем писать(изменять) значения. Тот же xmlstarlet не понимает несколько значений (record):
> эээ, "маладой челове-е-ек!", не пытайтесь нас обмануть!
> ничего искать не надо, всё уже изобретено, прекрасно понимает и работает

shell,sed,awk есть в системе и этого достаточно.
Но хочется на другом уровне абстракции.

> (лирическое отступление)
> xmlstarlet (xml), пришлось установить

Это я уже упоминал.


> короче, я сделал за тебя домашку

Не, скорее, разжевал бредовую документацию по работе с переменными.
И это не домашка, а учеба в написании законченного решения. Хз, удасться ли вообще продать хоть одну лицензию :)

> hint:
> чтобы менять нужно указывать что хотм менять, программа не телепат

это понятно.

> так работает
> xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"
> and @ttl="600"]/@value' -v 0 xml-config.xml
> и так тоже работает
> xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.123"]/@value'
> -v 0 xml-config.xml

Да, понял, рабочее решение.


> рабочие примеры
> xml ed -u '/zonelist/domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value'
> -v 0 xml-config.xml
> xml ed -u '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@value'
> -v 0 xml-config.xml

Записал.

> дарю
> http://xmlstar.sourceforge.net/doc/UG/ch04s03.html

ну, сравни для начала исходный XML.
У меня массив загнан в аттрибут record.
А в примерах жестко аттрибут-значение.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

15. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 16:44 
> Не, скорее, разжевал бредовую документацию по работе с переменными.

да ничего я не жевал, я этого "зверя" впервые вижу

> И это не домашка, а учеба в написании законченного решения.

но это не точно ))

> Хз, удасться ли вообще продать хоть одну лицензию :)

а почему нет?
да всё получится, дорогу осилит идущий

> ну, сравни для начала исходный XML.
> У меня массив загнан в аттрибут record.
> А в примерах жестко аттрибут-значение.

это не важно, всё равно
можно менять / переименовывать значения атрибутов, элементов

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

8. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 09:58 
хотел добавить и обновить своё сообщение, но упёрся в
"Редактирование разрешено только в течении 60 минут после изначальной публикации."

маловато будет! МАЛОВАТО!!

ну, тогда просто сделаем ADD_NEW_POST (вместо update old post)

вот такую штучку ещё возможно использовать
xml sel -t -v '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]/@value' xml-config.xml

и конкретно получаем 123.255.255.125

вместо такого
xml sel -t -c '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]' xml-config.xml
ну и вывод соответственно <record type="A" value="123.255.255.125" ttl="600"/>

а вдруг пригодится?!

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

11. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 12:56 
> ну, тогда просто сделаем ADD_NEW_POST (вместо update old post)
> вот такую штучку ещё возможно использовать
> xml sel -t -v '//domain[@name="domain02.net"]/record[@type="A" and @ttl="600"]/@value'
> xml-config.xml
> и конкретно получаем 123.255.255.125

Пример понятен, но мало эффективен.
Допустим есть функция change_IP_subdomain().
На входе знаем subdomain.$domain и новый IP.
Нужно сначала получить ttl для subdomain.$domain

Upd.

# xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @domain="subdomain01"]/@ttl' -n xml-config.xml
4H

Вот теперь рабочий рецепт :)

P.S. Хотя, надо тестить. В данном случае значение TTL не важно, но в некоторых записях record могут быть другие важные вторичные переменные...

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

13. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 16:24 
> Вот теперь рабочий рецепт :)

конечно рабочий и как раз таки эффективен

можем получить то, что нас интересует

xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @value="123.255.255.255"]/@domain' xml-config.xml
получим subdomain01

xml sel -t -v '//domain[@name="domain01.com"]/record[@type="A" and @domain="subdomain01"]/@value' xml-config.xml
получим 123.255.255.255

проверяем значения, сравниваем (если нужно) и меняем, опять таки если нужно

> P.S. Хотя, надо тестить. В данном случае значение TTL не важно, но
> в некоторых записях record могут быть другие важные вторичные переменные...

я не знаю, может быть.. ))

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

12. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 13:09 
Еще вопрос, как работать, если встретятся case-sensative переменные?
Например, TTL и ttl
Есть ли у xmllint или xmlstarlet (xml) какие-то дополнительные ключичики, типа grep -i ... ?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 13-Янв-19, 16:24 
> Еще вопрос, как работать, если встретятся case-sensative переменные?
> Например, TTL и ttl

да всё нормально будет, TTL и ttl отличаются ))

> Есть ли у xmllint или xmlstarlet (xml) какие-то дополнительные ключичики, типа grep
> -i ... ?

да, масса, надо начать отсюда
http://xmlstar.sourceforge.net/doc/UG/index.html

потом в каждом разделе, вначале
http://xmlstar.sourceforge.net/doc/UG/ch04.html
http://xmlstar.sourceforge.net/doc/UG/ch04s02.html
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
http://xmlstar.sourceforge.net/doc/UG/ch04s04.html

есть много волшебных ключиков,
увлекательное чтиво на ночь

ну, а как тебе такое, илон маск?

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

16. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 17:50 
>[оверквотинг удален]
>> -i ... ?
> да, масса, надо начать отсюда
> http://xmlstar.sourceforge.net/doc/UG/index.html
> потом в каждом разделе, вначале
> http://xmlstar.sourceforge.net/doc/UG/ch04.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s02.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
> http://xmlstar.sourceforge.net/doc/UG/ch04s04.html
> есть много волшебных ключиков,
> увлекательное чтиво на ночь

Чувак, ты реально тролль.
1) Документация имеет важный параметр  помимо полноты - понятность-читабельность.
2) Приведенные ссылки не отвечают на вопрос выше.
Пока вижу такое.


  -s or --sort op xpath     - sort in order (used after -m) where
  op is X:Y:Z,
      X is A - for order="ascending"
      X is D - for order="descending"
      Y is N - for data-type="numeric"
      Y is T - for data-type="text"
      Z is U - for case-order="upper-first"
      Z is L - for case-order="lower-first"

P.S. Часть претензий к проекту снимается, ибо в проекте нет кодеров и висит куча багов.

> ну, а как тебе такое, илон маск?

Он поставил на кон все, ждем, когда инвесторы его выкинут из проектов.

Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

18. "Чтение и редактирование XML файла"  –1 +/
Сообщение от universite (ok), 13-Янв-19, 21:56 

> 1) Документация имеет важный параметр  помимо полноты - понятность-читабельность.

https://habr.com/post/435878/

где-то в глубине текста, у автора наступает дзен.

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

17. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 13-Янв-19, 18:12 

> По пункту 2) кроме как sed не приходить в голову.
> P.S. где бы еще про xmllint почитать примеры?
> а то регэкспы вида:

Про регэкспы опять актуально.


    Example:
    <?xml version="1.0"?>
    <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
    (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
    </XPath>

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

20. "Чтение и редактирование XML файла"  +/
Сообщение от Аноним (20), 14-Янв-19, 20:01 
>[оверквотинг удален]
>> P.S. где бы еще про xmllint почитать примеры?
>> а то регэкспы вида:
> Про регэкспы опять актуально.
>
 
>     Example:
>     <?xml version="1.0"?>
>     <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
>     (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
>     </XPath>
>

И что за проблема, в чём вопрос?

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

22. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 14-Янв-19, 21:49 
>[оверквотинг удален]
>>> а то регэкспы вида:
>> Про регэкспы опять актуально.
>>
 
>>     Example:
>>     <?xml version="1.0"?>
>>     <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
>>     (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
>>     </XPath>
>>

> И что за проблема, в чём вопрос?

Например, что это за регэкспы "//." и "//namespace::*"
// - это понятно, а что дальше?

Ответить | Правка | ^ к родителю #20 | Наверх | Cообщить модератору

24. "Чтение и редактирование XML файла"  +/
Сообщение от михалыч (ok), 15-Янв-19, 13:58 
> Про регэкспы опять актуально.
>
 
>     Example:
>     <?xml version="1.0"?>
>     <XPath xmlns:n0="http://a.example.com" xmlns:n1="http://b.example">
>     (//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
>     </XPath>
>

XPath очень мощное средство для работы с XML
но разбираться в тонкостях - я пас
(конечно, если приспичит и нужда заставит, то придётся, а пока не буду)))

вот, если есть время и желание изучать ==> https://ru.wikipedia.org/wiki/XPath
и там в конце есть, похоже, то что нужно - XPath в примерах ==> http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html

дерзай ))

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "Чтение и редактирование XML файла"  +/
Сообщение от Pahanivo (ok), 14-Янв-19, 15:54 
Афтар, а не проще изначально зоны хранить в plain test, а потом парсить регекспами?
Не понимаю подобных извратов :)
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

21. "Чтение и редактирование XML файла"  –1 +/
Сообщение от universite (ok), 14-Янв-19, 21:46 
> Афтар, а не проще изначально зоны хранить в plain test, а потом
> парсить регекспами?
> Не понимаю подобных извратов :)

Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.

Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

23. "Чтение и редактирование XML файла"  +/
Сообщение от Pahanivo (ok), 15-Янв-19, 11:50 
> Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.

В том же перле это все делается как два пальца об асфальт с плейном. От того мне и не понятно зачем нужно все упихать в XML - ибо имхо парсит XML регексами это настоящее извращение.

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

25. "Чтение и редактирование XML файла"  +/
Сообщение от universite (ok), 15-Янв-19, 18:16 
>> Не проще. Парсить пробелы, табы, переносы строк - то еще удовольствие.
> В том же перле это все делается как два пальца об асфальт
> с плейном. От того мне и не понятно зачем нужно все
> упихать в XML - ибо имхо парсит XML регексами это настоящее
> извращение.

А почему Perl? Есть еще хайповые Rust и Go!

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

26. "Чтение и редактирование XML файла"  +/
Сообщение от Pahanivo (ok), 16-Янв-19, 08:10 
> А почему Perl? Есть еще хайповые Rust и Go!

Потому что он как раз по это заточен. Чуть меньше чем полностью.

Ответить | Правка | ^ к родителю #25 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру