0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
|
1 | |
Где найти мануал по парсингу XML? Как работать с XML в Delphi (в частности, TXMLDocument)?15.10.2013, 10:14. Показов 48054. Ответов 13
Метки attributenodes, attributes, c, childnodes, ixmlnode, txmldocument, txmlnode, xml, xml dom, xmldocument (Все метки)
Всех приветствую!
Раньше несколько лет работал в Матлабе, но теперь приспичило писать программу на Дельфи. Надо открывать xml-файлы, считывать из них информацию (имена элементов, их количество, значения элементов (<element1>Значение</element1>), атрибутов (как сами названия атрибутов, так и их значения). Работаю в Embarcadero RAD Stiduo XE3. Там есть компонент TXMLDocument, наверно, известный многим программящим на Delphi. Вроде бы и умеет много. Но проблема в том, что по нему нет понятной документации и описания. Хэлп в RAD Studio - фигня, потому что нормальной информации там нет; только разбросанная по страницам скудная справка по некоторым методам и процедурам (без примеров и нормального описания). Перерыл весь инет. Нашёл только темы на форумах с решением конкретных задач, где надо ещё час разбираться что делает та или иная строка, связанная с обращением к xml-файлу. Сидеть и дедуктивным методом пытаться догадаться, что делает та или иная строка кода, метод, процедура - увольте, слишком долго. Наверняка есть пути проще. Мне же нужно руководство по основным функциям, процедурам и методам, применяемым при работе с xml. Учебник, мануал, описание. Или хотя бы "xml в Delphi для чайников". Например, вот тут: http://parsing-and-i.blogspot.... elphi.html есть некоторая информация по работе с xml, о том, как посчитать кол-во дочерних узлов, вытащить значения атрибутов и элементов и т. п. Но этого мало. Это лишь частные примеры, которые могут быть понятны подготовленному человеку. Мне же -новичку - нужна более фундаментальная и понятная информация, описание по пунктам (с самого начала!), по переменным, их типам, методам, процедурам и т. п.. Например: Для открытия xml-файла используем метод XMLDocument1.LoadFromFile('filemane.xml'), где filename - имя файла. Переменная nodelist типа IXMLNode служит для хранения списка дочерних элементов. Для определения этого списка служит метод Xmldocument1.DocumentElement (где XMLDocument1 - исследуемый xml-файл). Для определения количества дочерних узлов применяется метод nodelist.ChildNodes.Count (где nodelist - переменная со списком дочерних элементом). Чтобы запросить содержимое дочернего элемента 'element1' используется метод XMLDocument1.DocumentElement.ChildNodes['element1'].Text... и в таком духе дальше по всем применяемым методам, процедурам, типам данных. Где найти подобные мануалы/описания? Кто может помочь? Пример xml: <parent> <element name="el1" attr1="value">Text1</element> <element name="el2" attr1="value2">Text2</element> <element2>Text3</element2> </parent> Мне собственно нужно научиться делать следующие операции: -считывать имя корневого элемента, его атрибуты, содержимое; -считывать количество (это уже умеем) и имена дочерних элементов ('element', 'element2'); -получать значения атрибутов (el1, el2), имена атрибутов (name, attr1) и содержимого элементов (Text1, Text2, Text3), в том числе когда названия элементов одинаковы; -менять содержимое элементов, в т. ч. по условию (например, поменять элементу element с именем el2 содержимое Text2 на, скажем, Text5; -добавлять новые элементы, атрибуты. Я, конечно, могу написать собственный xml-парсер, который будет всё это делать. Но не хотелось бы изобретать велосипед, когда всё это уже изобретено. Заранее спасибо за конструктивные советы!
0
|
15.10.2013, 10:14 | |
Ответы с готовыми решениями:
13
Как работать с XML в Delphi? Требуется совет по парсингу XML документов Как работать в Delphi 7 с сетью. (Где найти документацию) Выгрузка в XML файл результатов запроса. Создание xml схемы с имеющегося xml файла |
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
15.10.2013, 12:41 | 2 | |||||
Информацию по XML, HTML, CSS и пр. можно брать здесь:
1. W3Schools: http://www.w3schools.com/ 2. DOM: http://www.w3schools.com/dom/default.asp 3. DOM Node: http://www.w3schools.com/dom/dom_node.asp 4. DOM Element: http://www.w3schools.com/dom/dom_element.asp Кроме этого, в редакторе Delphi можно открыть, например, модуль XMLIntf. Там имеются описания интерфейсов:
На форуме можно поискать примеры. Например: Программа редактирования XML - документа https://www.cyberforum.ru/delp... ost4903448 Парсинг одинаковых тегов из хмл XML, как вытащить данные Запись между определенными тегами XML XML изменение значения между тегами И т. д.
3
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
|
15.10.2013, 12:52 [ТС] | 3 |
За ссылки спасибо, почитаю. Конкретно с самим XML и DOM в целом понятно. Непонятно как, опираясь на DOM, распарсивать файл в Дельфи.
Указанные темы на форуме видел, читал. Но там скорее решение конкретной задачи без общих сведений. Что ж, буду изучать. В конце концов, никогда не поздно написать свой парсер - боюсь, будет даже проще
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
15.10.2013, 13:10 | 4 | |||||
Содержимое файла загружается в экземпляр TXMLDocument. XMLDocument представляет данные в виде DOM модели. А DOM модель - это дерево, состоящее из узлов. Каждый узел представлен интерфейсом - например, IXMLNode. Остаётся перебирать эти узлы и извлекать из них нужные сведения. Вот и всё, собственно.
DOM представление для того и придумано, чтобы упростить задачу разбора документа. А написание полноценного парсера XML - это сложная и трудоёмкая задача. Добавлено через 5 минут На самом деле знать надо только следующее: DOM - это дерево, состоящее из узлов типа IXMLNode. Каждый узел IXMLNode знает о своём родительском узле и знает о своих дочерних узлах. Таким образом, получив доступ к корневому элементу документа:
0
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
|
15.10.2013, 13:19 [ТС] | 5 |
Уже понятнее стало
Сам-то принцип ясен. Я просто пока не знаю, как оформить это синтаксически (проблема именно в синтаксисе!). Ищу пока понятный мануал, где подробно расписано что делает тот или иной метод (а не тип входных/выходных значений и принадлежность к тому или иному классу, как это описано в хэлпе), какие доступны. Модуль XMLInf, что вы скинули - почти то, что нужно. Найти бы где-нибудь подробное описание его составляющих (методов, процедур) с примерами (именно применительно к Дельфи, а не в общем виде...)
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
15.10.2013, 13:36 | 6 |
По IXMLNode и по другим интерфейсам на эту тему - есть прямо в справке Delphi. Правда примеров там нет. Но примеры можно на сайте найти.
Вот из этих задач надо выбрать какую-нибудь и решать. А здесь в теме помогут.
0
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
||||||
15.10.2013, 13:38 [ТС] | 7 | |||||
Не получилось к предыдущему сообщению добавить: я просто недоумеваю, неужели нет в сети нормального пошагового описания работы с XML в Дельфи? Хотя бы на английском. Где всё по пунктам разложено. И не применительно к конкретному примеру, а в общем виде.
У меня в xml есть фрагмент:
*чешет репу* Окей, тогда я действительно опишу задачу конкретнее и выложу тут. Думаю, так было бы продуктивнее. Просто надо решить все из представленных задач (ожидается работа с большим числом разнотипных хмл-файлов). Что касается описаний в справке Дельфи - не могу их постичь и осилить. Вроде всё понятно, что там описано, но как применить это на практике - непонятно. Вроде бы и не двоечник, склад ума - технический, а решить эту задачу не получается
0
|
Супер-модератор
|
|
15.10.2013, 13:43 | 8 |
Отсюда и по ссылкам...
Что значит "в общем виде"? Пойди туда, не знаю куда? Работу с XML именно на примерах и надо разбирать, иначе не поймешь ничего...
0
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
||||||
15.10.2013, 13:51 [ТС] | 9 | |||||
Под общим видом я имею в виду саму модель синтаксиса, если можно так выразиться. Например, есть xml-файл вида:
Прочитав такую форму записи, я сразу пойму, что чтобы получить содержимое элемента <child> - текст Text5555 - мне надо объявить переменную а как строковую и написать: a:=XMLDocument1.DocumentElement.ChildNodes['child']; Т. е. мне нужен шаблон синтаксиса (а подставить нужные входные параметры я уже смогу сам). Я сегодня чуть позже напишу тут суть задачи на конкретном примере. Заранее благодарен за помощь, потому что сам, боюсь, не справлюсь
0
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
|||||||||||
16.10.2013, 18:09 [ТС] | 10 | ||||||||||
Итак, сформулирую свой вопрос применительно к реальной задаче.
Имеется xml-файл следующего вида:
(заранее извиняюсь, если неверно называю составляющие xml-документа) 1. Получить имя корневого элемента (в нашем случае ltm), а также список его атрибутов (version, type) и их значения ('1.0', 'settings'). 2. Получить количество элементов, являющихся дочерними по отношению к корневому. В данном случае их 7: templateFiles, dimensions, hotspot, hotspot, data, data, data. Получить имена элементов (тэгов) (templateFiles, dimensions и т. п.). Получив количество элементов и научившись извлекать их имена, я прогоню цикл от 0 до count-1 и сделаю что мне нужно. 3. Получить количество и список атрибутов требуемого элемента. Например, для элемента hotspot. Правильный ответ будет 4 атрибута. Для первого элемента hotspot это будут name, style, scena, ath. Для второго - то же, только вместо атрибута ath - атрибут rz. Заметьте, в файле 2 элемента hotspot, с разными атрибутами. Вот как с ними работать (если одноимённых элементов больше 1)? Я хочу так: получаю список дочерних элементов по отн. к корневому (см. п. 2), прогоняю по ним цикл с for и найду элементы hotspot, у которых параметр name равен требуемому (скажем 'hs015_2' - такой элемент будет заведомо один). Можно ли как-то решить этот вопрос без цикла? То есть, получить значение атрибута scena для элемента hotspot, у которого name="hs015_2"? 4. Проделать вышеописанное по отношению к узлам и элементам, являющимся дочерними по отношению к дочерним. В моём примере - узел <images> (дочерний по отношению к <templateFiles> и родительский по отношению к <pano> и <tiles>. Если я правильно понимаю, надо как-то передать содержимое узла <images> в переменную типа IXMLNode и делать то же, что и в п.1-3. Так? 5. Надо научиться изменять вышеуказанные параметры (задавать свои). Вроде пока всё. На данном этапе мне важнее всего синтаксические конструкции. Например, a:= XMLDocument1.DocumentElement.ChildNodes['progname'].Text - данное выражение присваивает строковой переменной а содержимое элемента <progname>. a:= VarToStr(XMLDocument1.DocumentElement.ChildNodes['hotspot'].Attributes['rz']) - данное выражение присваивает переменной а значение атрибута rz элемента hotspot. (эти 2 выражения я на одном форуме раздобыл, а вот дальше как - не знаю). Кто владеет этой темой, напишите пожалуйста и другие синтаксические конструкции для решения вышеописанных вопросов (как получить атрибуты, их кол-во, кол-во элементов, их имена и т. п.). Главное сейчас - овладеть синтаксисом, а свой алгоритм я уж реализую потом. Заранее всем огромное спасибо! Сам просто не справлюсь.
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||||||||||||||||||||||||||||||||||||||||||
28.10.2013, 18:12 | 11 | |||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
По согласованию в ЛС продолжаем тему.
Сначала про открытие/закрытие XML документа. 1. Загрузка XML содержимого из файла в XMLDocument.
Да, верно - можно таким образом действовать. Выполнить перебор всех узлов в ветви с заданным корнем можно, например, с помощью рекурсивного алгоритма. Или без рекурсии можно использовать стек или очередь. Пример кода с рекурсивным перебором:
7
|
0 / 0 / 0
Регистрация: 15.10.2013
Сообщений: 14
|
|
28.10.2013, 19:11 [ТС] | 12 |
Mawrat, спасибо Вам огромное за информацию! Завтра, придя на свежую голову на работу, буду вникать и пробовать. Думаю, теперь-то уж точно справлюсь
0
|
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
|
|
29.10.2013, 09:35 | 13 |
Можно как то этот манул "закрепить" в разделе форума? Очень подробно все рассписано!!!!!
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
29.10.2013, 11:49 | 14 |
Для закрепления, тема, всё-таки, должна быть более развёрнуто проработана.
Добавлено через 3 минуты Если объединить со сведениями, например, из этой темы: Программа редактирования XML - документа и добавить ряд дополнительных материалов, вот тогда можно было бы закрепить.
0
|
29.10.2013, 11:49 | |
29.10.2013, 11:49 | |
Помогаю со студенческими работами здесь
14
Ко всем файлам добавилось .xml, теперь они в формате ***.xls.XML, ***doc.XML (изначально в Word и Excel) Как работать с XML? Как работать с XML? Как работать с xml? Как работать с XML в SQLServer? как работать с xml-файлом? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |