Помогите пожалуйста с запсью/чтеньем XML!!!!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Vadim » 25.04.2010 12:32:32

sign писал(а):Суть форматов, таких как XML, JSON и других - самодокументируемость данных.

Это если она нужна - самодокументируемость. Как раз у человека проблема то в другом - присутствие необходимых данных в файле вообще, так сказать - в принципе. В этом случае, если программа должна прочитать жёстко заданный блок данных, присутствие названия этих самых данных вообще необязательно. Главное, чтобы были все необходимые значения. При этом и алгоритм чтения этих значений упрощается, а скорость чтения значений увеличивается по сравнению с тем, как если бы мы использовали компоненты для чтения пары - "название = значение". Тут вообще на первом месте по простоте и скорости стоит типизированный файл.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение sign » 25.04.2010 14:58:34

Чем хорош самодокументируемый формат данных.
Тем, что можно забыть про то, как именно записаны данные, сколько записано и в каком порядке.
И больше не будет довлеть - байт влево, байт вправо - расстрел.
Что иногда происходит, когда обнаруживается, что данные добавляются, программа модифицируется и нужно обязательно помнить и правильно читать блок с данными.
Я лично для себя. решил, что научившись работать с данными в самодокументируемом формате (XLS или JSON) в дальнейшем облегчу себе жизнь.
Что и произошло.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 25.04.2010 15:26:19

А просто запросить у открытого XML документа по названию узла его наличие возможно?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Vadim » 25.04.2010 17:19:28

qivi
В статье, которую Вы уже прочитали, есть этому пример.
Код: Выделить всё
Doc.DocumentElement.FindNode('password');

Если результат NIL, значит нет такого узла, если есть - возвращается узел. Или, если речь идёт только о наличии - not NIL.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Sergei I. Gorelkin » 25.04.2010 17:52:52

1) Поддержка JSON есть в FPC из коробки, пакет fcl-json. Имхо, несколько лучшего качества, нежели компонент с progdigy.

2) Ф-ция FindNode ищет только непосредственных детей узла. Кроме того, она есть только в FCL, в других реализациях xml ее нет.

Запрос узлов по названиям, как правило, делается с помощью xpath. Реализация XPath в FCL довольно неоптимальна, но в принципе работает.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 14.12.2010 01:55:17

Воскрешу тему.

Подскажите пожалуйста, как записанные вот так атрибуты:
Код: Выделить всё
TDOMElement(DopUzel).SetAttribute('id','001');         // Создаём атрибуты родительского узла

потом считать из XML? Узел может содержать бесконечное число атрибутов?

А вообще, на этот раз я похоже схлестнусь с XML посерьёзнее. Фактически мне нужно создать своего рода базу данных, каждый логически выделенный блок информации будет содержать неопределённое число элементов. Каждый логический блок информации обязательно будет содержать уникальный идентификатор, именно к нему и будет привязана прочая информация. Задача, зная этот идентификатор найти и вытащить всю связанную с ним информацию (её будет не так уж много, но количество не определено). Как правильнее (грамотнее) это реализовать?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Verx0Laz » 14.12.2010 04:03:32

qivi

Вот! В этом месте боги сжалились над тобой и указали путь! Старый кашерный путь -> txt->ini->csv->dbf->fdb... И уж если проблема изврата над данными дошла до сложности бд - надо переходить на бд :) А XML изначально годится исключительно на роль переносчика данных между базами (загрузка - выгрузка)...
Хотя, конечно, все мы страдаем изобретательством велосипедов, но исключительно в нерабочее время... ровно настолько, насколько профессионалы.
Пиши конвертер, пока сложность вопроса не зашкалила за решаемость задачи...
Аватара пользователя
Verx0Laz
постоялец
 
Сообщения: 125
Зарегистрирован: 11.09.2007 11:24:07

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 14.12.2010 11:55:20

txt->ini->csv->dbf->fdb..

Об этом уже думал (о dbf в основном)
Не подходит, данные очень специфичные непредсказуемые зарание, более того в перспективе будут эволюционировать и по составу и по неоднородности. ОпенОфис, а с 2007 и МС офис весь на XML работает и не жужат.

Серьёзно, если кто знает подскажите как такие велосипеды строятся именно на XML. Тут выше по теме (в прошлый раз). говорили что XML самодокументирующейся, и можно как то читать "название = значение", как это реализуется? Подойдёт?

Грубо говоря есть уникальный идентификатор который известен зарание, к нему привязан набор неоднородных данных количество и состав которых принципиально не ограниченно. Как я представляю ищем узел скажем одноимённый с этим идентификатором, а потом сканирую все его дочерние узлы (привязанные к идентификатору данные), или же эти данные можно хранить в атрибутах узла.
Последний раз редактировалось qivi 14.12.2010 12:11:43, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Maxizar » 14.12.2010 12:10:34

Ну не знаю поможет или нет но вот предлагаю посмотреть исходник в котором идет разбор Xml файла и отображение через TTreeView. Программа разбирает любые "правильные xml" все Xml файлы созданные через Lazarus открывает на ура. В архиве даже есть скрин как я этой прогой открыл Xml файл из DRKB последней версии. Исходник мой так что никто ничего не нарушил :). Ну и при этом писалось для друга чтоб показать как это делается, так что там могут быть и ляпы :oops: если что пишите.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 14.12.2010 12:37:00

Maxizar, а как разобрать эти процедуры в процедурах... а то с непривычки не читабельно... :oops:
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Maxizar » 14.12.2010 14:23:38

Переписал в более читабельный вид, вынес все в отдельные процедуры добавил пару коментариев по коду. Можно разобраться.
Ну все же пару коментариев:
1. Процедура Procedure XmlToTreeView(const FileName:String); - принимает имя файла XML.
Данная процедура проверяет на валидность файл если его нет выходим, если же есть то сразу же добавляем в TreeView корневой узел с названием = Имени переданного файла. Даже если файл пустой он будет добавлен в TreeView , ведь читать его мы будем чуть позже.
2. В этой же процедуре мы читаем переданный нам файл при помощи XMLRead и передаем уже TXMLDocument по ссылке (для экономии времени на копировании, файл может быть большим). в процедуру XmlToNode(XML,RootNode); //Собственно начали работу.
3. Данная процедура принимает TXMLDocument по ссылке и Корневой узел TreeView именно в этот узел мы и будем добавлять все остальное, ведь этот узел связан именно с файлом, имя которого и передали в XmlToTreeView для этого файла и был создан корневой узел в TreeView в пункте 1. И именно с этим файлом связан TXMLDocument.
4. Войдя в процедуру XmlToNode мы проверяем валидность переданного XmlDocumenta если он Нил выходим. (произошла ошибка в парсере хмл).
5. Если все ОК. делаем вот это: For I:=0 To XMLDoc.ChildNodes.Count-1 do //Пробегаем все узлы верхнего уровня Xml файла
6. и каждый найденный узел передаем в XMLNodeToTreeNode(XMLDoc.ChildNodes.Item[I],RNode); //тут работаем уже с конкретным узлом
7. XMLNodeToTreeNode - Рабочая лошадка. Она делает всю работу.
8. Она изночально пробегает все аттрибуты Узла (XML узла) и добавляет их как узел (Уже как узел TreeView). Имя узла TreeView имеет вид: 'Имя Аттрибута = Значение аттрибута'. Это видно на скрине.
9. Дальше: for IDomNode:=0 to XMLNode.ChildNodes.Count-1 do //Пробегаем дочерние узлы XMLNode
10. В п 9. мы рекурсивно вызываем процедуру XMLNodeToTreeNode.

10.1 UTF8Encode(XMLNode.Attributes.Item[Iatr].NodeName) и т.п. Для понимания русских букв... Далее по коду все прозрачно.

НУ Как более подробно я уже не знаю. Так что успехов. :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Odyssey » 14.12.2010 15:17:49

Может быть ещё вот это поможет:
http://wiki.lazarus.freepascal.org/XML_Tutorial/ru
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 15.12.2010 01:13:35

Maxizar, огромное спасибо. Твой ответ - мечта :) !
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение qivi » 26.06.2011 04:14:47

А каким методом удаляется узел?

То есть я считал документ, промотал его в цикле (сопоставляя данные) до нужного мне узла, мне его необходимо удалить и записать документ обратно в файл.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Помогите пожалуйста с запсью/чтеньем XML!!!!

Сообщение Maxizar » 26.06.2011 12:03:26

Код: Выделить всё
XMLNode.RemoveChild();

Где XMLNode Родительский узел..
RemoveChild метод узла, который принимает дочерний узел типа TDOMNode, который нужно удалить.

Если нужно удалить самый верхний уровень узла (Корень) то XMLDoc.RemoveChild();, где XMLDoc: TXMLDocumen.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 252

Рейтинг@Mail.ru