ньюфаг осваивает программирование. И по случаю на работе стоит SolarisИ ,о мучения, нужно распарсить XML используя только Solaris. В чем малина? Есть xml такого вида<xn:MeContext id="CV0001"> <xn:VsDataContainer id="CV0001_021"> </xn:attributes> <xn:VsDataContainer id="10563"> </xn:VsDataContainer> <xn:VsDataContainer id="10587"> </xn:VsDataContainer> <xn:VsDataContainer id="10612"> </xn:VsDataContainer></xn:VsDataContainer></xn:MeContext>Как можно отличить два xn:VsDataContainer друг от друга ? Вот пример команды nawk -F'<' '/<xn:MeContext/{split($0,a_Context,"\"");v_Context=a_Context[2]}/<xn:VsDataContainer/{split($0,a_data,"\"");v_data=a_data[2]}\/<xn:VsDataContainer/{split($0,a_data2,"\"");v_data2=a_data2[2]}\{print v_Context v_data v_data2}' myfile.xmlВ sed можно сделать отступ строки, а как быть тут ?
>>812937 (OP)вот так нагляднее ?<xn:VsDataContainer id="CV0001_021"> </xn:attributes> <xn:VsDataContainer id="10563"> </xn:VsDataContainer> <xn:VsDataContainer id="10587"> </xn:VsDataContainer> <xn:VsDataContainer id="10612"> </xn:VsDataContainer></xn:VsDataContainer>
>>812937 (OP)Что значит "распарсить"? Получить parse tree? С awk у тебя это не получиться. Вытащить что-то конкретное? Тогда пиши, что именно.
>>812943сука почему съедает пробелы в начале...
>>812944скорее всего вытащить что-то конкретное. а именно строки содержащие xn:MeContext, xn:VsDataContainer и будь это нечто иное, то все полилось бы, но третья строка/переменная тоже содержит xn:VsDataContainer Как их отличить ? В начале каждой строки разное количество пробелов. для Второй это скажем 28, для 3-ей 32.
>>812952> скорее всего вытащить что-то конкретное. а именно строки содержащие xn:MeContext, xn:VsDataContainerИспользуй grep
>>812952на выходе должно получиться CV0001 CV0001_021 10563
>>812953через GREP будет долго обрабатываться + нужно делать цикл. Это не удобно. xml то состоит из кучи таких вот данных. будь это несколько строчек, я бы не спрашивал как выдернуть данные.
>>813557Кекнул с тебя, маня. Греч у него медленный. Ну пиздец
>>814081ЛОЛ. школник. если xml весит овер 100 метров, то парсить ты будешь, используя греп, через условие If,then.
> xn:MeContextЭто не из Эрикссона случайно xml?
>>817106именно )
>>817128Вроде бы xml там в таком формате, что парсить можно хоть микроволновкой, должно быть где-то описано сколько пробелов, какая последовательность, атрибуты всегда будут в конце и т.д и т.п. Т.е. парсить тем, чем ты собираешься должно быть норм. Но наверно никто в эрике уже так не делает, макаками были наделаны стопицот программ, как вычленять данные. Лучше спроси коллег, нет ли уже чего готового, 100% ты делаешь то, что уже кто-то сделал.
>>817132В общем коллеги без понятия.Нашел/подсказали в аналах Solaris gawk. (nawk просто днище. ни какого описания)Проблема решена через регулярные выражения.затык был именно в пробелах. полставляется в шаблон /^ {28}<xn:VsDataContainer/ и все прекрасно парсится.
>>812937 (OP)Для парсинга XML есть утилиты вроде xmlstarlet, понимающие XML, Xpath итд. А ты занимаешься наркоманством.
>>817665будь это мой линукс и будь я админов... поставил бы разные утилиты. НО эта рабочий Linux Solaris. Все за деньги.
>>812937 (OP)Берешь и пишешь парсер, в чем проблема?
В солярке стопудово есть перл, берешь из спана наиболее подходящую библиотеку и парсишь аки боженька.