URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10254
[ Назад ]

Исходное сообщение
"Чтение и редактирование XML файла"

Отправлено universite , 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
мне не понятны


Содержание

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


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

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


"Чтение и редактирование XML файла"
Отправлено михалыч , 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/'


"Чтение и редактирование XML файла"
Отправлено universite , 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 сделает замену только один раз и не в том месте...


"Чтение и редактирование XML файла"
Отправлено universite , 12-Янв-19 19:22 
дел.

"Чтение и редактирование XML файла"
Отправлено михалыч , 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

ну, что ещё?


"Чтение и редактирование XML файла"
Отправлено universite , 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 нет?


"Чтение и редактирование XML файла"
Отправлено михалыч , 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

такие дела..


"Чтение и редактирование XML файла"
Отправлено universite , 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.
А в примерах жестко аттрибут-значение.


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

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

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

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

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

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

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

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


"Чтение и редактирование XML файла"
Отправлено михалыч , 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"/>

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


"Чтение и редактирование XML файла"
Отправлено universite , 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 могут быть другие важные вторичные переменные...


"Чтение и редактирование XML файла"
Отправлено михалыч , 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 могут быть другие важные вторичные переменные...

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


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

"Чтение и редактирование XML файла"
Отправлено михалыч , 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

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

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


"Чтение и редактирование XML файла"
Отправлено universite , 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. Часть претензий к проекту снимается, ибо в проекте нет кодеров и висит куча багов.

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

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


"Чтение и редактирование XML файла"
Отправлено universite , 13-Янв-19 21:56 

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

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

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


"Чтение и редактирование XML файла"
Отправлено universite , 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>


"Чтение и редактирование XML файла"
Отправлено Аноним , 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>
>

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


"Чтение и редактирование XML файла"
Отправлено universite , 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::*"
// - это понятно, а что дальше?


"Чтение и редактирование XML файла"
Отправлено михалыч , 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

дерзай ))


"Чтение и редактирование XML файла"
Отправлено Pahanivo , 14-Янв-19 15:54 
Афтар, а не проще изначально зоны хранить в plain test, а потом парсить регекспами?
Не понимаю подобных извратов :)

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

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


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

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


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

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


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

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