Xml parsing

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуйте, .

Окружение:Cla 6.1ABC, OS WinXP
Проблема такая... Нужно перегнать данные из xml-файла в queue.
И нужно это сделать весьма шустро... Разумеется это мой первый опыт со связкой clarion+xml, а файл по структуре весьма навороченный.
Граждане, плиз, может кто поделится примерчиком разбора xml-файла навороченной структуры(Attribut-based style). Оочень надо...

--
С уважением,
Макунин Алексей
pfrbr mailto:pfrbr@online.debryansk.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Насколько я понимаю, ты можешь рассчитывать на примерчик использования того или иного парсера (MSXML, клашкин почиканый, другой) либо на пример рукопашного разбора...
Последний вариант не рекомендую применять.
Что касается стандартных парсеров, посоветовал бы MSXML, либо че-нить из рекомендаций W3C... С реализацией проблем быть не должно, на все есть доки, читай и ваяй...
Если же надумаешь писать свой парсер (оптимизированный по ресурсам и скорости), можешь обращаться с вопросами, буквально годик назад занимался такой штукой, что-то смогу подсказать...

--
Best regards,
asn mailto:asn@arsis.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Речь идёт о почиканном. В Libsrc\cpxml.clw есть процедура ViewXML, котрая показывает структуру XML.

Если лень разбираться, маленький пример.

Код: Выделить всё

<?xml version="1.0" encoding="windows-1251" ?>
<Screen Id="Y214" header="Затраты переменные, постоянные" type="E">
<controls>
   <control type="0" id="0" No="0" file="27-1.JPG" w="377" h="224" fontname="Ms Sans Serif" fontsize="8" align="C" tiled="1">
      <caption><![CDATA[Некий текст]]></caption>
   </control>
   <control type="200" id="1" No="1" x="19" y="14" w="339" h="194" fontname="Ms Sans Serif" fontsize="8">
     <caption><![CDATA[Некий текст]]></caption>
   </control>
</controls>
</Screen>
Сакральный смысл этого текста - описание в XML структуры некоего экрана.

Код: Выделить всё

xmlDoc      &Document,Auto
Nl          &Nodelist,Auto
nnm         &NamedNodeMap,auto
ANode       &Node,Auto
AttrIndex   Long

ListXML     queue(DOMQueue) ! Очередь для считывания параметров
            end

            Code
            xmlDoc &= XMLFileToDOM(FileName)  ! Считали и пропарсили
            FillDomQueue(XMLDoc,ListXML,1)    ! Разобрали
            Loop ListXML#=1 to Records(ListXML)
              Get(ListXML,ListXML#) ! Прочитали элемент
              Case lower(ListXML.Node.getNodeName()) ! Проверим имя
              тэга
              Of 'screen' ! <Screen>
              Of 'controls' ! <Controls>
              Of 'control'  ! <Control>
                Do ProcessControl
                ! Добавить запись о контроле
              Of 'caption'  ! <Caption>
                ! Поле CDATA находится в следующей записи
                Get(ListXML,ListXML#+1)
                Loc:Caption=ListXML.Node.GetNodeValue()
              ....
              End
            End
            xmlDoc.Release()
            Free(ListXML)
            Return

ProcessControl Routine  ! Разборка параметров тега
! Например <control type="3" id="9" No="7" file="A17.WMF" x="53" y="242" w="129" h="48">
             nnm &= ListXML.Node.getAttributes()
             if not nnm &= null
              loop AttrIndex = 0 to nnm.getLength() - 1
                Anode &= nnm.item(AttrIndex)
                Case lower(ANode.GetNodename())
                Of 'type'
                  ControlsQueue:Type=Anode.GetNodeValue()
                Of 'id'
                  ControlsQueue:Id=Anode.GetNodeValue()
                ....
                End
              End
            End
            nnm.Release()
            Exit
Ну и так далее... А вопрос о чтении файлов в Windows-1251 уже обсуждался.

--
C уважением
Yuri
Адрес:yufil@mail.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

А такой - же красивый пример в обратную сторону можно?
Ответить