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

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

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

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

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

oan42



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Важными критериями при выборе XML-парсера/райтера являются:
  • всеядность;
  • скорость.
  • удобство разработки приложений при DOM или SAX парсинге.
     
    NativeXML по этим критериям лучше, чем XMLPartner.
    К тому же NativeXML проще оптимизировать и улучшить скорость
    парсинга на 30-40%.
     
    Остальные XML-парсеры глубоко не копал, но не приглянулись они мне,
    IMHO, это поделки, а не солидные продукты.

  • Всего записей: 488 | Зарегистр. 03-08-2004 | Отправлено: 00:56 06-06-2007
    Hiken



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пользуюсь JvSimpleXml из Delphi JEDI и всем доволен.

    Всего записей: 1343 | Зарегистр. 14-01-2006 | Отправлено: 16:53 06-06-2007
    SergZZzz13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Тут вот еще вопрос один, как сделать так чтобы когда я создаю DOMDocwment, ему как то сказать что я работаю с кодировкой cp1251, а то XML с русскими символами не хотят грузица, да и вообще надо что бы XML сообщения были в кодировке cp1251

    Всего записей: 7 | Зарегистр. 09-11-2005 | Отправлено: 13:36 08-06-2007
    vshersh



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SergZZzz13
    Перед загрузкой в файле документа должна быть явно указана кодировка - иначе считается, что кодировка UTF-8
    Если сильно хочется загрузить документ в кодировке 1251 не добавляя шапку к документу, можно загрузить его в строку s и вызвать метод loadXml(AnsiToUtf8(s))

    Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 14:16 08-06-2007
    afiget



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SergZZzz13
    Вот из проекта на С++ Builder:
        Doc = NewXMLDocument ("1.0");
        Doc->XML->Clear();
        Doc->Active = true;
        Doc->Encoding = "windows-1251";

    Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 11:36 10-06-2007
    Kins



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Приветствую многоопытный люд.
    Что то давно на форуме тема XML в Delphi не поднималась... все научились чтоль?
    Учусь работать с XML в Delphi, есть вопросы - поможете?
    Почитал мануалы, обьектная модель XML вроде в голове сложилась а вот создавать/разбирать пока не очень получается
     
    Разьясните,плизз, отличия msxml.pas (из состава Delphi) от MSXML2_TLB.pas (полученный из msxml6.dll) ?
    Пока мой учебный проект работает и с тем и с другим...
     
    И ещё вопрос - при создании XML в файл всё пишется в одну строку (нечитабельно получается) - как после закрывающего тега конец строки вставить?
     

    Всего записей: 132 | Зарегистр. 30-10-2003 | Отправлено: 10:35 10-10-2007 | Исправлено: Kins, 10:40 10-10-2007
    sea78



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пользуюсь родным XMLDocument ... проблем не было
     
    Kins
    Пытался повторить (про одну строку), не получилось. шли код

    Всего записей: 119 | Зарегистр. 24-01-2006 | Отправлено: 10:46 17-10-2007
    Kins



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    sea78
     
    Сенькс, хоть кто то откликнулся
     
    У меня Delphi7 стоит, но на панели нет такого TXMLDocument ....

    Всего записей: 132 | Зарегистр. 30-10-2003 | Отправлено: 16:18 17-10-2007
    sea78



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kins
     
    Про одну строку - пример:
     
    '<строка 1>'#13'<строка 2>'#13'<строка 3>'
     
    Про 7 дельфу:
    Я с 5 дельфы сразу переходил на 2005, поэтому тут тебе не советчик, но если нет иконки это еще не значит что нет самого невизуального компонента. Тоесть тебе больше необходима справочная система где ты ищешь "TXMLDocument " ... если повезет и в справочной системе он будет значит пол-дела сделано... останется прочитать и сделать.
    А если не будет в справке - пиши, поставлю - проверим (дистриб придется искать)... удачи
     

    Всего записей: 119 | Зарегистр. 24-01-2006 | Отправлено: 13:28 23-10-2007
    afiget



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kins
    Назначить непустую строку NodeIndentStr и в Options добавить doNodeAutoIndent.

    Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 13:47 23-10-2007
    Kins



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

    Всего записей: 132 | Зарегистр. 30-10-2003 | Отправлено: 18:07 23-10-2007
    Felias Fogg

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть XML файл с такой структурой, нужно его трансформировать в 2 Data Packet-a.(Header.db, Records.db)

    Код:
     
    <Document-Order>  
    <Order-Header>  
      <OrderNumber>TEST01</OrderNumber>  
      <OrderDate>2003-08-20</OrderDate>  
    </Order-Header>  
     
    <Order-Lines>  
      <Line>  
        <Line-Item>  
          <LineNumber>1</LineNumber>  
          <EAN>1111111111111</EAN>  
          <BuyerItemCode>123456</BuyerItemCode>  
           <OrderedQuantity>23.000</OrderedQuantity>  
          <UnitOfMeasure>KG</UnitOfMeasure>  
          <TaxRate>20.00</TaxRate>      
        </Line-Item>  
      </Line>  
      <Line>  
        <Line-Item>  
          <LineNumber>2</LineNumber>  
          <EAN>112222222111111</EAN>  
          <BuyerItemCode>1000456</BuyerItemCode>  
           <OrderedQuantity>77.000</OrderedQuantity>  
          <UnitOfMeasure>KG</UnitOfMeasure>  
          <TaxRate>20.00</TaxRate>      
        </Line-Item>  
      </Line>  
    </Order-Lines>  
     

    Header трансформируется правильно, а Records - только 1 линию Вот трансформация Records

    Код:
     
    <XmlTransformation Version="1.0">
    <Transform Direction="ToCds" DataEncoding="UTF-8">
     <SelectEach dest="DATAPACKET\ROWDATA\ROW" from="\Document-Order">
        <Select dest="@OrderNumber" from="\Order-Header\OrderNumber"/>
        <Select dest="@LineNumber" from="\Order-Lines\Line\Line-Item\LineNumber"/>
        <Select dest="@EAN" from="\Order-Lines\Line\Line-Item\EAN"/>
        <Select dest="@BuyerItemCode" from="\Order-Lines\Line\Line-Item\BuyerItemCode"/>
        <Select dest="@ItemType" from="\Order-Lines\Line\Line-Item\ItemType"/>
        <Select dest="@OrderedQuantity" from="\Order-Lines\Line\Line-Item\OrderedQuantity"/>
     </SelectEach>
    </Transform>
     

     
    Примечание:
    Файл трансформации делался XML Mapper в Delphi 7
     
    Как его правильно трансофрмировать??

    Всего записей: 28 | Зарегистр. 11-11-2008 | Отправлено: 14:30 07-05-2009
    X11



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, как мне прочитать значение тегов status, text, ids, mess
     
    D2007
     
     

    Код:
     
    <?xml version="1.0" encoding="utf-8"?>
    <response>
     <status>OK</status>
     <text>Сообщения отправлены</text>
     <ids>
       <mess tel="380502084020">p000ccf5f4</mess>
     </ids>
    </response>
     

     
     

    Код:
     
    Var
      XMLResponse: TStringStream;
    begin
    ...
      XMLRequest := TStringList.Create;
      XMLResponse := TStringStream.Create('');
      XMLDocument1 := TXMLDocument.Create(nil);
     
    ...
    //получают ответ от сервер в виде xml (utf-8)
      idHttp.Post(fServerAddress, XMLRequest, XMLResponse, DestEncoding, DestEncoding);
     
    //загружаю в XMLDocument
      XMLDocument1.LoadFromStream(XMLResponse, xetUTF_8);
      XMLDocument1.Active := true;
     
    //читаю значение тэга status
      ShowMessage(XMLDocument1.DocumentElement.ChildNodes['status'].Text);
    end;
     

     
    в строке с ShowMessage получаю Invalid Pointer Operation.
     
    Что я забыл, где неверный код?
    Спасибо  


    ----------
    /не мы такие, жизнь такая/

    Всего записей: 3260 | Зарегистр. 24-11-2005 | Отправлено: 11:50 14-12-2011 | Исправлено: X11, 12:30 14-12-2011
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    X11
    Попробуй так.
    aNode := XMLDocument1.DocumentElement.ChildNodes.FindNode('status');
    if (Assigned(aNode)) then
      ShowMessage(VarToStr(aNode.NodeValue));

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 12:04 14-12-2011
    X11



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а как объявить  aNode? Какого типа?
     
     
    Добавлено:
    зачем делать find, если по коду видно, что такой тег присутствует?  
     
    Добавлено:
    Сделал по твоему примеру, всё равно Invalid Pointer Operation.  
     
    Добавлено:
    та же самая ошибка на ShowMessage:
     

    Код:
          XMLDocument1.LoadFromStream(XMLResponse, xetUTF_8);
          XMLDocument1.Active := true;
     
          ShowMessage(IntToStr(XMLDocument1.DocumentElement.ChildNodes.Count));
     

     


    ----------
    /не мы такие, жизнь такая/

    Всего записей: 3260 | Зарегистр. 24-11-2005 | Отправлено: 12:34 14-12-2011
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    X11
    Вот работающий пример

    Код:
     
    uses XMLDoc, XMLIntf;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      aXMLDoc: IXMLDocument;
    begin
      aXMLDoc := LoadXMLData('<?xml version="1.0" encoding="utf-8"?><response><status>OK</status><text>111111</text><ids><mess tel="380502084020">p000ccf5f4</mess></ids></response>');
      ShowMessage(IntToStr(aXMLDoc.DocumentElement.ChildNodes.Count));
    end;
     

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 13:12 14-12-2011
    AlexCoRu

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

    Код:
    var
      XMLDocument: TXMLDocument;
      Node: IXMLNode;
    begin
      XMLDocument.Active := True;
      XMLDocument.SetNodeIndentStr(#9);
      XMLDocument.Options := XMLDocument.Options + [doNodeAutoIndent];
      XMLDocument.DocumentElement := XMLDocument.CreateNode('Root', ntElement, '');
      XMLDocument.DocumentElement.AddChild('Node');
      Node.AddChild('Child');
    end;

    Так вот по завершении Node.ChildNodes.Count будет больше 1! Т.к. добавятся ещё узлы из-за doNodeAutoIndent. Как быть? Хочется чтобы и отступы сохранялись, и левых узлов не было. Искать другой парсер?

    Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 20:48 25-09-2012
    AlexCoRu

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всё. Нашёл: FormatXMLData.

    Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 23:24 25-09-2012
    Tabu13



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, а как вам XMLParser c http://www.destructor.de/xmlparser/download.htm ?
     
    Добавлено:
    Это все для разбора XML. А есть-ли готовые продукты для выгрузки данных из таблицы в XML формат? В сети ни одного примера выгрузки грида в XML не нашел Тот же EHLib умеет строить древовидную структуру, а вот выгрузить в XML  - проблема

    Всего записей: 163 | Зарегистр. 20-12-2002 | Отправлено: 20:04 26-09-2012
    AlexCoRu

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tabu13
    Дело в том, что сам по-себе вгруженный xml ни кому не нужен. Нужно что бы xml соответствовал некоторой схеме которую кто-то разработал (насколько корректно зависит от этого кого-то), а там уж в одном xmlе может быть несколько таблиц и ещё и справочники к ним до кучи.

    Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 21:15 26-09-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3

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


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru