forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=124)
-   -   Lib_xml2 Другая версия парсера XML документов (http://forum.boolean.name/showthread.php?t=13610)

odd 29.10.2010 13:44

Lib_xml2 Другая версия парсера XML документов
 
Вложений: 2
Предлагаю вам другую версию парсера XML документа. Главное отличие данного парсера от Lib_xml состоит в том, что можно парсить не весь XML документ и потом в этой каше искать нужные параметры, а пробежаться по документу и достать только нужные параметры в нужных тегах.

Работа с библиотекой очень простая, в библиотеке всего 4 команды:

string load(s: string) - Загрузить XML документ в библиотеку

integer read - Команда просто читает очередной тег из XML документа
Если тег был прочитан нормально, то возвратится значение 1
В противном случае (XML документ закончился) возвратится 0

string name - Возвращает имя прочитанного тега

string attr(a: string) - Возвращает значение атрибута под названием a для ранее прочитанного тега

Внимание! Если какой-то текст содержится между тегами (например, "<b>Жирный текст</b>"), то он будет
определяться как тег с именем #TEXT, а сам текст можно получить запросив значение атрибута value.
Комментарии определяются как тег #COMMENT, текст комментария доступен также через атрибут value.

Библиотека НЕ использует никаких специальных JSRов для работы с XML поэтому будет работать на любом телефоне.

Пример: Допустим мы имеем примерно такой XML документ (взято из Википедии):
PHP код:

<?xml version="1.0" encoding="UTF-8"?>
<recipe name="хлеб" preptime="5" cooktime="180">
  <title>Простой хлеб</title>
  <ingredient amount="3" unit="стакан">Мука</ingredient>
  <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
  <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
  <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  <instructions>
   <step>Смешать все ингредиенты и тщательно замесить.</step>
   <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
   <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->
   <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
  </instructions>
</recipe>

Предположим, нам нужно сначала вывести на экран список ингредиентов, а затем текст самого рецепта. В таком случае программа будет выглядеть примерно так:

PHP код:

Program XML2test;
Uses xml2;
Var s, t: string;
i, y: integer;

Begin
    s:='<?xml version="1.0" encoding="UTF-8"?><recipe name="хлеб" preptime="5" cooktime="180"><title>Простой хлеб</title><ingredient amount="3" unit="стакан">Мука</ingredient><ingredient amount="0.25" unit="грамм">Дрожжи</ingredient><ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient><ingredient amount="1" unit="чайная ложка">Соль</ingredient><instructions><step>Смешать все ингредиенты и тщательно замесить.</step><step>Закрыть тканью и оставить на один час в тёплом помещении.</step><!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... --><step>Замесить ещё раз, положить на противень и поставить в духовку.</step></instructions></recipe>';
    xml2.load(s); // Загружаем XML документ
    y:=0;
    
    // Пример #1 - вывод на экран столбика игридиентов
    while (xml2.read > 0) do // Читаем пока можно читать
    begin
        if (xml2.name = 'ingredient') then
        begin
            t := '' + xml2.attr('amount') + ' ' + xml2.attr('unit');
            i := xml2.read;
            t := t + ' ' + xml2.attr('value');
            DrawText(t, 5, y);
            y:=y+GetStringHeight('W');
        end;
    end;
    
    Repaint; Delay(5000);
    SetColor(255, 255, 255); FillRect(0, 0, GetWidth, GetHeight);    SetColor(0, 0, 0);
    
    // Пример #2 - вывод на экран самого рeцепта
    xml2.load(s);
    y:=0;
    while (xml2.read > 0) do // Читаем пока можно читать
    begin
        if (xml2.name = 'step') then
        begin
            i := xml2.read;
            DrawText(xml2.attr('value'), 5, y);
            y:=y+GetStringHeight('W');
        end;
    end;
    
    Repaint; Delay(5000);
End.



Часовой пояс GMT +4, время: 10:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot