Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Разбор XML файла со сложной структурой

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

kba



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сабж собственно... чего-то вызывает затрудения...
 
файл примерно такой структуры:
 
<Unit Value="....." id="......">
<Lesson Value="....." id=".....">
<Exercise Value="......" id=''......." pid="........." eid="....." result="....."/>
</Lesson>
</Unit>
 
Простой xml файл вроде не сложно.... но со сложной структурой - чё-то запутался....

Всего записей: 191 | Зарегистр. 08-01-2002 | Отправлено: 06:50 17-06-2004
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Так я не понял, ты пытаешься его парсить самостоятельно что ли? ибо я не вижу ничего сложного в парсинге при помощи того же DOM

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 07:53 17-06-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
Не мог бы объяснить поподробнее, встречал где то работу с XML но так до конца не разобрался, А ведь сейчас многие проги его юзают, на мелкософт залазил - какая то лажа . Если есть кинь проект, поразбиарюсь или так объясни.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 08:37 17-06-2004
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
Значит так, существует две самые распространенные методики парсинга xml-файлов. Это во-первых, DOM-парсинг, то есть когда в памяти строится дерево xml-элементов со всеми атрибутами, данными. оч удобно когда нужно постоянно перемещаться между элементами, но память жрет, и построение дерева занимает какое-то время. Самый известный парсер - это COM-объект от Microsoft (в Delphi работа с ним инкапсулируется в модуле msxml). Второй способ - это потоковый способ обработки (SAX), там используется событийная методика, то есть когда парсер нашел новый элемент - возникает событие, когда закрывается элемент - тоже событие, ну итд. Оч быстрый метод, но однопроходный, то есть когда обработан весь файл, то вернутся на середину и там что-то считать нельзя. в Delphi с ним не работал, но в Perl использовал его (XML::Parser::ReplSAX), оч понравилось.
 
Да, кстати, есть еще один вариант парсинга xml - вручную.
 
насчет DOM. Сначала получаем ссылку на интерфейс IXMLDOMElement. Потом загружаем в него документ методом Load. Основный интерфейсом при работе станет IXMLDOMElement (реализующий отдельный элемент). Получаем ссылку на корневой элемент: XMLRootNode := XMLTree.documentElement, ну а потом все легко. Можно узнать имя элемента: XMLNode.nodevalue, его текст: XMLNode.text, узнать атрибуты: XMLNode.attributes.getNamedItem('nameattr').nodeValue;
перечислить всех детей:

Цитата:
if XMLNode.hasChildNodes then
    for i := 0 to XMLNode.childNodes.length - 1 do
    begin
      CurrXMLElement := XMLNode.childNodes.item[i] as IXMLDOMElement;
      { что-то сделать с дитем CurrXMLElement }
    end;

 
Ссылки:
1. http://www.g299792458.boom.ru/articles/xml.html (в статье работа ведется с IXMLElement2, но разницы немного)
2. http://www.delphikingdom.com/asp/itemq.asp?mode=1&itemid=429 (хорошая подборка статей на Королевстве Delphi)
 
Примеры
У меня все залито в проекты - выцеплять неохота. Но к книге Марко Канту шли примеры по работе с XML -если будет желание - то вышлю, но завтра, так как они у меня дома.
 
Добавлено
Еще ссылка: По самой сути XML можно также прочитать на rsdn, так сказать вводная:
http://rsdn.ru/article/xml/xml-1.xml

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 09:35 17-06-2004 | Исправлено: krast, 09:38 17-06-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
У меня все залито в проекты - выцеплять неохота. Но к книге Марко Канту шли примеры по работе с XML -если будет желание - то вышлю, но завтра, так как они у меня дома.

Пока не надо высылать, разберусь по ссылкам, это не срочно просто хочу разобраться, чтобы потом использовать, а то я все по старинке через реестр и инишки хоть часто и на читстом АПИ.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 00:49 18-06-2004
kba



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
действительно примеры бы не помешали.

Всего записей: 191 | Зарегистр. 08-01-2002 | Отправлено: 03:56 18-06-2004
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
чтобы потом использовать, а то я все по старинке через реестр и инишки

ну у меня xml используется как основа в передаче данных между разными программами, также в xml удобно хранить сложные структуры - например деревья.
 
kba

Цитата:
действительно примеры бы не помешали

эх, ShIvADeSt вчера молчал, так я и не захватил их, давай вышлю по мылу седня вечером!

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 08:28 18-06-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
не мог бы ты посоветовать с парсером для следующей структуры XML на Дельфи 5  

Цитата:
 
<?xml version="1.0" encoding="WINDOWS-1251"?>
<sen:SigEnvelope xmlns:sen="urn:cbr-ru:dsig:env:v1.0">
<sen:PrimarySig>
<dsig:SigValue xmlns:dsig="urn:cbr-ru:dsig:v1.0"> RpxoZ6vnUXn9/nTSC9rkqeWtlNYTc+RxWZ5JbdFW6Vlg+ULhx7uDJFPRIdqxXJnIugF2xzlpgjCtmh4hz9tLAg==</dsig:SigValue>
</sen:PrimarySig>
<sen:ControlSig>
<dsig:SigValue xmlns:dsig="urn:cbr-ru:dsig:v1.0"> i01zjNFRrTgxMbwnCmfHRE+MFmA6dq53xKtFPCQ9JBKI8YLPaCiSRL97WDe761bEELFtlFQ3O/H9GSmOCx+siw==</dsig:SigValue>
</sen:ControlSig>
<sen:Object>
<ED101 xmlns="urn:cbr-ru:ed:v1.0" EDNo="7" EDDate="2003-04-14" EDAuthor="4525545000" PaytKind="1" Sum="2400000" TurnoverKind="1" TransKind="01" ChargeOffDate="2003-04-14" Priority="6" ReceiptDate="2003-04-14">
<AccDoc AccDocNo="4" AccDocDate="2003-04-14"></AccDoc>
<Payer INN="7726274727" PersonalAcc="40702810200203001037">
<Name>ООО ТЕХНО ПЛЮС</Name>
<Bank BIC="044525545" CorrespAcc="30101810300000000545"/>
</Payer>
<Payee INN="7726062105" PersonalAcc="40702810010130010079">
<Name>ООО ТД ТОРНАДО-ПРОДУКТ</Name>
<Bank BIC="044525219" CorrespAcc="30101810500000000219"/>
</Payee>
<Purpose>ОПЛАТА ПО ДОГОВОРУ 95456 ОТ 15.01.2003 В ТОМ ЧИСЛЕ НДС 4000 РУБ</Purpose>
</ED101>
</sen:Object>
</sen:SigEnvelope>
 
 

а то я чего то не догоняю

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:48 19-07-2004
rtr2004

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Установи себе любой ХМЛ компонент (хоть и из 6-7 делфя) и работай. Принципов работы всего 2 (см. выше). Проще, по-моему, ДОМ. Его назначение - построить дерево, причем построение совсем не зависит от содержания ХМЛ-документа. А уже ты обрабатывай как хочешь это дерево (хочешь проверяй элементы и атрибуты на тип, хочешь на имя и тд.).
Префиксы в элементах просто указывают на верифицырующий (контролирующий) документ (ДТД, схему), но для построения дерева, это, по большому счету, все-равно.

Всего записей: 2 | Зарегистр. 31-08-2004 | Отправлено: 15:59 31-08-2004
krast

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
не мог бы ты посоветовать с парсером для следующей структуры XML на Дельфи 5  

В отпуске был я, пропустил твой вопрос, если еще помощь надо - обращайся!

Всего записей: 442 | Зарегистр. 15-09-2003 | Отправлено: 09:14 03-09-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krast
Тут такой вопрос возник по xml
есть сл. структура

Цитата:
 
<?xml version="1.0" encoding="WINDOWS-1251"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Header>
<MessageInfo xmlns="urn:cbr-ru:msg:props:v1.0">
<To>uri</To>
<From>uri</From>
<MessageID>uri</MessageID>
<MessageType>1</MessageType>
<Priority>1</Priority>
<CreationTime>2004-06-17T09:30:47</CreationTime>
</MessageInfo>
</Header>
</Envelope>
 

мне нужно сделать такую же
 делаю вот как

Цитата:
 
  Doc:=CoDomDocument.Create;
  Doc.Set_async(false);
  Doc.Load(ApPath+'\Test.xml');
  Node2:=Doc.createElement('Envelope');
  Attr:=Doc.createAttribute('xmlns');
  Attr.Value:='http://www.w3.org/2003/05/soap-envelope';
  Node2.Attributes.SetNamedItem(Attr);
  Node3:=Doc.CreateElement('Header');
  Doc.AppendChild(Node2);
  Node2.appendChild(Node3);
  Node4:=Doc.CreateElement('MessageInfo');
  Node2.appendChild(Node3);
  Node3.appendChild(Node4);
  Node:=Doc.createProcessingInstruction('xml','version=''1.0'' encoding=''WINDOWS-1251''');
  Doc.InsertBefore(Node,Doc.firstChild);
  Doc.save(ApPath+'\Test.xml');
 

однако получается вот так

Цитата:
 
<?xml version="1.0" encoding="WINDOWS-1251"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope"><Header xmlns=""><MessageInfo/></Header></Envelope>
 

вот первых в одну строку, во вторых поялвяетя лишний аттрибут у Header
что здесь не так? ил и что подправить. Просто в инете мало инфы

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:01 22-11-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
<MessageInfo xmlns="urn:cbr-ru:msg:props:v1.0">  

Мне кажется что в этой строчке пространство имён. И ещё:

Цитата:
Node2.Attributes.SetNamedItem(Attr);  
  Node3:=Doc.CreateElement('Header');  
      Doc.AppendChild(Node2);  
  Node2.appendChild(Node3);  

Не понимаю я, думаю компилятор тоже. Мне кажется совершенно запутано.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 10:26 22-11-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio
переделал по другому

Цитата:
 
var
    Doc          omDocument;
    Node         :IXMLDOMNode;
    Node2,Node3,Node4,Node5
                 :IXMLDOMElement;
    txt          :IXMLDOMText;
begin
{    with BindDb do begin
      Active:=False;
      DatabaseName:=WorkDir;
      TableName:=OutDoc;
      Active:=True;
     end;   }
  Doc:=CoDomDocument.Create;
  Doc.Set_async(false);
  Doc.Load('');
  Node:=Doc.createProcessingInstruction('xml','version=''1.0'' encoding=''WINDOWS-1251''');
  Doc.Set_preserveWhiteSpace(True);  
  Doc.appendChild(Node);
  Node2:=Doc.createElement('Envelope');
  Node2.setAttribute('xmlns','http://www.w3.org/2003/05/soap-envelope');
  Node3:=Doc.CreateElement('Header');
  Doc.AppendChild(Node2);
  Node2.appendChild(Node3);
  Node4:=Doc.CreateElement('MessageInfo');
  Node4.setAttribute('xmlns','urn:cbr-ru:msg:props:v1.0');
  Node5:=Doc.CreateElement('To');
  txt:=Doc.createTextNode('uri');
  Node5.appendChild(txt);
  Node4.appendChild(Node5);
  Node5:=Doc.CreateElement('From');
  txt:=Doc.createTextNode('uri');
  Node5.appendChild(txt);
  Node4.appendChild(Node5);
  Node5:=Doc.CreateElement('MessageID');
  txt:=Doc.createTextNode('uri');
  Node5.appendChild(txt);
  Node4.appendChild(Node5);
  Node2.appendChild(Node3);
  Node3.appendChild(Node4);
  Doc.save(ApPath+'\Test.xml');
 

первая проблема исчезла, но вторая, то что весь xml документ в одну строку кроме первой осталась. Что нужно написать, чтобы документ сохранял структуру как мне нужно


----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:50 22-11-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
Пробовал для эксперимента закомментировать следующее?

Цитата:
Node4.setAttribute('xmlns','urn:cbr-ru:msg:props:v1.0');  

Извини, я уже не помню что там с пространством имён.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 17:10 22-11-2004
Dimonka



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Delphi 7
File -> New -> Other -> New -> XML Data Binding
 
Эта штука сама пoстрoит вам интeрфeйсы для ваших "слoжных" структур.

Всего записей: 398 | Зарегистр. 03-01-2002 | Отправлено: 20:08 22-11-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Delphi 7  
File -> New -> Other -> New -> XML Data Binding  
 
Эта штука сама пoстрoит вам интeрфeйсы для ваших "слoжных" структур.

Если бы была 7 Дельфя я бы не спрашивал, а так дельфи 5 стоит. И мне надо, чтобы строилась нормальная структура

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:54 23-11-2004
Pupsik

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробуй либу SimpleXML, там все ощень просто...
mv.rb.ru
постоянно ей пользуюсь и чрезвычайно доволен!
Правда давненько не обновлялаьс, но в Delphi6-7 работает без проблем.
Думаю в 5 пойдет.

Всего записей: 553 | Зарегистр. 13-03-2003 | Отправлено: 10:44 23-11-2004
serg_light



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вот первых в одну строку

Я думаю, что это не проблема. Потому как парсеру всё равно, как отформатировано, главное что бы структура была правильная.

Всего записей: 3 | Зарегистр. 21-11-2004 | Отправлено: 00:44 24-11-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pupsik

Цитата:
Попробуй либу SimpleXML, там все ощень просто...  
mv.rb.ru  
постоянно ей пользуюсь и чрезвычайно доволен!  
Правда давненько не обновлялаьс, но в Delphi6-7 работает без проблем.  
Думаю в 5 пойдет.

Не подошла, ибо не может делать всего что мне надо. По крайней мере, я ее пробовал использовать.

Цитата:
Я думаю, что это не проблема. Потому как парсеру всё равно, как отформатировано, главное что бы структура была правильная.

Для меня это проблема, так как мне еще надо смотреть чтобы все было правильно, а когда все записано в одну строку, наглядности нету

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:07 24-11-2004
Glukodel



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Не подошла, ибо не может делать всего что мне надо. По крайней мере, я ее пробовал использовать.  
 
Цитата:
Я думаю, что это не проблема. Потому как парсеру всё равно, как отформатировано, главное что бы структура была правильная.
 
Для меня это проблема, так как мне еще надо смотреть чтобы все было правильно, а когда все записано в одну строку, наглядности нету

 
По личному опыту - самое гибкое и мощное решение при разборе XML - применение XSL/XSLT для преобразований (не нужно дополнительно парсить, проще отлаживать, изменять). В дельфи(работаю на 7-й) есть XMLDocument (в него закачивается XML) и XSLPageProducer (в него закачивается XSL) соединяшь два компонента и по вызову XSLPageProducer.ContentFromString(s) (в переменной s - исходный XML) вернется нужный результат (у меня - готовые, отформатированные строки SQL запроса, вставляющие данные в БД без дальнейших преобразований)
В общем, день-два, потраченные на XSL, будут соответствовать "день потратить, за час долететь" ;)
 
Лучшая из наденных ссылок по XSL:
http://www.raleigh.ru/XML/XSLTutorial/contents.htm
Использование XML в среде Delphi (используется родной виндовый парсер, что, имхо менее удобно, а в остальном, идея таже...):
http://edocs.al.ru/xml/Delphi_XML.html

Всего записей: 97 | Зарегистр. 16-08-2004 | Отправлено: 19:14 24-11-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Разбор XML файла со сложной структурой


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru