LINUX.ORG.RU

Можно ли рассчитывать на порядок перечисления потомков в XML::LibXML ?

 , ,


0

1

Доброго времени суток

Длинная предыстория: Есть один массив производства EMC, и единственный известный мне способ вытащить из него статистику в свою систему мониторинга - использовать утилиту naviseccli. Не знаю насчёт разработчиков массива, но разработчики naviseccli точно были кончеными дебилами.

Есть два режима вывода информации - обычный и «xml», один другого хуже. В обычном в качестве разделителя поле-значение могут использовать ":", «=» или вообще ничего. Пример:

$ /opt/Navisphere/bin/naviseccli  -h 1.1.1.1 getcache
[...]
Read Hit Ratio:                     N/A
Write Hit Ratio:                    N/A
Prct Dirty Cache Pages =            78
Prct Cache Pages Owned =            49
SPA Read Cache State                Enabled
SPB Read Cache State                Enabled
[...]

В виде «xml» эта проблема отходит на второй план, хотя жизнедеятельность надмозга-погромиста видна и здесь, включением разделителя в имя параметра

<PARAMVALUE NAME="Prct Cache Pages Owned =            " TYPE="uint64"><VALUE>49</VALUE>
</PARAMVALUE>

<PARAMVALUE NAME="SPA Read Cache State                " TYPE="string"><VALUE>Enabled</VALUE>
</PARAMVALUE>

Но появляется проблема в разделении разных объектов, например, разных дисков в запросе «getdisk». В «xml» выводе и имя диска, и все его параметры располагаются на одном уровне. И разные объекты отделены друг от друга .... ДВУМЯ ПЕРЕВОДАМИ МАТЬ ИХ СТРОКИ. В XML. Переводами строки. Отрывать яйца и ломать руки. Соответственно, ни одна стандартная библиотека разбора xml на такой изврат не рассчитана, и отделять один объект от другого придётся мне.

Так вот, вопрос. Могу ли я рассчитывать, что если в исходном xml в перечисляемых на одном уровне параметрах соблюдается определённый порядок, то и в выводе XML::LibXML::Element->getChildrenByTagName сохранится тот же порядок?

★★★★★

Есть два режима вывода информации - обычный и «xml»

Бери обычный, не геморойся.

linuxnewb
()

В обычном в качестве разделителя поле-значение могут использовать ":", «=» или вообще ничего

Судя по xml-ному куску, имена всех ключей одинаковой длинны. Можешь просто по позиции резать.

linuxnewb
()

Зависит от XSD-схемы. Если в схеме сказано что порядок важен - он и будет важен в xml (как это в xhtml сделано, например). Если нет - всё целиком на усмотрение парсера.

iamtakingiteasy
()
Ответ на: комментарий от iamtakingiteasy

Насколько мне известно, LibXML насрать на схему. можно только валидировать

chg ★★★★★
()
Ответ на: комментарий от linuxnewb

К сожалению, не везде. Проще будет порядок элеметнов в xml контролировать.

/opt/Navisphere/bin/naviseccli -h 1.1.1.1 getdisk:

Soft Read Errors:        0
Soft Write Errors:       0
Read Retries:     N/A
Write Retries:    N/A
[...]
Current Speed: 6Gbps
Maximum Speed: 6Gbps

«Я вся такая непредсказуемая». @#$%^& !

router ★★★★★
() автор топика
Ответ на: комментарий от chg

Спасибо, пойду читать документацию

router ★★★★★
() автор топика
Ответ на: комментарий от router

Ну хз, по значению попробуй.

Проще будет порядок элеметнов в xml контролировать.

Тож на тож, имхо, в лучшем случае.

linuxnewb
()
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my $data = q(Read Hit Ratio:        N/A
Write Hit Ratio:                    N/A
Prct Dirty Cache Pages =            78
Prct Cache Pages Owned =            49
SPA Read Cache State                Enabled
SPB Read Cache State                Enabled
);

for (split /\n/ => $data){
	my @tokens = split;
	my $value = pop @tokens;
	my $key = (m/(.*)( \=|\:)/ig)? $1: join ' ' => @tokens;

	say "'$key' -> '$value'";
}
$./tt 
'Read Hit Ratio' -> 'N/A'
'Write Hit Ratio' -> 'N/A'
'Prct Dirty Cache Pages' -> '78'
'Prct Cache Pages Owned' -> '49'
'SPA Read Cache State' -> 'Enabled'
'SPB Read Cache State' -> 'Enabled'
joy4eg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.