Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
.NET 4.x

Парсинг XML

19.02.2014, 08:00. Показов 1777. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим есть следующая XMLNodeCollection (по сути List<XmlElement>):
XML
1
2
3
4
5
6
7
8
9
10
11
<cat level="2" attr="some1">a</cat>
<cat level="3" attr="some2">a1</cat>
<cat level="3" attr="some3">a2</cat>
<cat level="4" attr="some4">a2_1</cat>
<cat level="3" attr="some5">a3</cat>
<cat level="2" attr="some6">b</cat>
<cat level="3" attr="some7">b1</cat>
<cat level="4" attr="some8">b1_1</cat>
<cat level="3" attr="some9">b2</cat>
<cat level="4" attr="some10">b2_1</cat>
<cat level="2" attr="some11">c</cat>
и дан массив строк (а, c, b1)

Не могу придумать алгоритм (желательно рекурсивный ибо 4 уровня это не потолок), чтобы из вот такого листа получить значения атрибутов самого нижнего для ветки уровня, при условии что ветка попадает под фильтрацию.

Т.е. из ветки а должен выбраться атрибут у элементов а1, а2_1, а3.
также должно выбраться b1_1 и с

т.е. на выходе должен получиться List<string> (some2, some4, some5, some8, some11)

Одну из проблем что возникла у меня: xml именно такой. Был бы он вложенным (т.е. все уровни были бы дочерними как по уму) можно было бы придумать чего. А так кроме слепого перебора ничего в голову не идёт.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2014, 08:00
Ответы с готовыми решениями:

Парсинг xml
Всем привет, подскажите пожалуйста как спарсить следующий фрагменты xml файла fieldset/table/tbody &lt;tr&gt; ...

xml парсинг
пишу рсс-ридер, и пытаюсь как-нить разобрать пришедший рсс файл. в следующем коде, например, я пытаюсь выхватить все заголовки итемов: ...

Полный парсинг Xml на c#
Есть книга в формате fb2 - &lt;FictionBook xmlns=&quot;http://www.gribuser.ru/xml/fictionbook/2.0&quot; xmlns:l=&quot;http://www.w3.org/1999/xlink&quot;&gt; ...

10
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.02.2014, 08:35
Создайте своё дерево, исходя из содержимого - "a", "a1" и т.д. Потом уж будет просто.
0
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
19.02.2014, 09:42  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Создайте своё дерево, исходя из содержимого - "a", "a1" и т.д. Потом уж будет просто.
Обдумывал. Сложность в придумывании алгоритма. в конечном итоге да, нужно эту мишуру преобразовать в дерево, которое потом можно спокойно кинуть в рекурсивный разбор (ибо разбор другого дерева уже есть)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.02.2014, 09:57
Цитата Сообщение от Midas Посмотреть сообщение
Сложность в придумывании алгоритма.
Ну извините, тут уж вам никто ничего не посоветует. Только исходя из вашей логики.
1
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.02.2014, 10:44
Выложите кусок валидного XML, или у вас XML вида?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<root>
<cat level="2" attr="some1">a</cat>
<cat level="3" attr="some2">a1</cat>
<cat level="3" attr="some3">a2</cat>
<cat level="4" attr="some4">a2_1</cat>
<cat level="3" attr="some5">a3</cat>
<cat level="2" attr="some6">b</cat>
<cat level="3" attr="some7">b1</cat>
<cat level="4" attr="some8">b1_1</cat>
<cat level="3" attr="some9">b2</cat>
<cat level="4" attr="some10">b2_1</cat>
<cat level="2" attr="some11">c</cat>
</root>
1
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
19.02.2014, 10:57  [ТС]
Grishaco, Истинно так.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.02.2014, 10:59
Цитата Сообщение от Midas Посмотреть сообщение
Т.е. из ветки а должен выбраться атрибут у элементов а1, а2_1, а3.
также должно выбраться b1_1 и с
Теперь про алгоритм, если я правильно понял, то вам нужно у level = 2 выбрать все у которых level > 2?
0
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
19.02.2014, 11:43  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
Теперь про алгоритм, если я правильно понял, то вам нужно у level = 2 выбрать все у которых level > 2?
у level=2 нужно выбрать все level=3 (если их значение входит в массив), если у какого-то из 3го левела есть потомок level=4, то опять же его проверяем: значение входит в массив - берём. если есть у 4го потомок 5 - то...

То бишь вот вроде и цикл рекурсивный. Но в пред случае у меня левел=3 был явным потомком левела 2. И там всё удачно сложилось. А тут дерево одноуровневое и только атрибутами показано что да как..

Для применения пред рекурсивной функции мне надо это невалидное нечто привести как-то к виду многоступечатого списка с правильной вложенностью узлов.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
19.02.2014, 11:58
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от Midas Посмотреть сообщение
если их значение входит в массив
Что за массив не понятно.

Я бы сделал так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            var dataSet = new DataSet();
 
            string xml =
                "<?xml version=\"1.0\"?><root><cat level=\"2\" attr=\"some1\">a</cat><cat level=\"3\" attr=\"some2\">a1</cat><cat level=\"3\" attr=\"some3\">a2</cat><cat level=\"4\" attr=\"some4\">a2_1</cat><cat level=\"3\" attr=\"some5\">a3</cat><cat level=\"2\" attr=\"some6\">b</cat><cat level=\"3\" attr=\"some7\">b1</cat><cat level=\"4\" attr=\"some8\">b1_1</cat><cat level=\"3\" attr=\"some9\">b2</cat><cat level=\"4\" attr=\"some10\">b2_1</cat><cat level=\"2\" attr=\"some11\">c</cat></root>";
            dataSet.ReadXml(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
 
            DataRow[] dataRows = dataSet.Tables[0].Select("cat_Text = 'a'");
            var level = dataRows[0]["level"].ToString();
 
            var rows =dataSet.Tables[0].Select(string.Format("level > {0}", level));
 
            foreach (DataRow dr in rows)
            {
                Console.WriteLine((string)dr["attr"]);
            }
 
            Console.ReadLine();
1
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 17
19.02.2014, 12:43  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
Что за массив не понятно.
и дан массив строк (а, c, b1)

в данном массиве перечисляются значения веток. Если у текущей ветки значение входит в в массив - то проверяем её подветки пока не доберёмся до самой нижней, атрибуты которой и запоминаем.

Если значенией текущей проверяемой ветки в массив не входит, то и нет смысла проверять её потомков.

Т.е. из ветки а должен выбраться атрибут у элементов а1, а2_1, а3.
также должно выбраться b1_1 и с
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.02.2014, 14:19
Midas, если нормально сериализовать рекурсивную структуру, то и парсить будет легко. А раскидывать дерево в массив - глупо, если только это не упаковка достаточно разреженного дерева.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2014, 14:19
Помогаю со студенческими работами здесь

Парсинг xml структуры
Всем привет, Народ, ткните в ошибку, что делаю не так. есть структура: &lt;JewelleryItem Ref=&quot;E0404&quot;...

Парсинг многострочных значений XML
Имеем такой док &lt;root&gt; &lt;tab&gt; Line1 Line2 Line3 Line4 &lt;/tab&gt; &lt;/root&gt;

Парсинг XML и вывод на консоль
Приветствую.Проблема такова:есть xml-файл.Надо вывести все его &quot;чистое&quot; содержимое,без всяких &quot;&lt;xxx&gt;&lt;/xxx&gt;&quot;.Делаю...

Парсинг Xml и запись в файл
Здравствуйте, суть проблемы в следующем: мне необходимо пройти по всем полям Xml документа, вытащить всю информацию по двум вакансиям и...

Парсинг XML файла из Яндекс Метрики
Всем привет. Пишу, ради практики, небольшую прогу, которая будет отображать данные из щетчиков Яндекс Метрики. Уже перерил кучу примеров,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru