URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 45694
[ Назад ]

Исходное сообщение
"Помогите!!! Нужен парсер XML на C"

Отправлено Андрей , 01-Июл-04 11:13 
Доброго времени суток.

Скачал парсер expat. Установил под линукс. Он работает и что-то парсит, но я не пойму как использовать не готовую программу а исходный код в своей программе. Читал документацию, возникают большие трудности с пониманием - английский знаю очень плохо. Если кто знает как использовать этот или любой другой парсер, пжалуйста, подскажите или дайте ссылку.

Спасибо.


Содержание

Сообщения в этом обсуждении
"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 01-Июл-04 12:39 
Помогите

"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 01-Июл-04 13:45 
IMHO lixml лучше, чем expat. Работает быстрее и стабильнее.
Примеры работы с ним можешь почитать на http://www.xmlsoft.org/examples/index.html
Скачать там же.
Изложи проблему подробнее, не совсем понятно, тебе надо просто XML парсить?

"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 01-Июл-04 15:55 
>Изложи проблему подробнее, не совсем понятно, тебе надо просто XML парсить?

Излагаю подробнее. Есть прграмка на С, которая запрашивает у сервера XML страничку с результатом поиска слова(н-р sex), после получения странички её надо представит в удобном виде, типа

url&&то, что в теге2(н-р description),...\n
url&&то, что в теге2(н-р description),...\n

и записать в файл.
Вот и всё.
Но с разбором проблемы. Писать такую процедурку самому - гемор. Посоветовали найти готовый парсер. Дальше знаешь.
Помоги, если можешь.

Спасибо.


"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 01-Июл-04 17:32 
Ну... надеюсь, это поможет (для libxml2)

--xmltest.c--
#include <libxml/parser.h>
#include <stdio.h>

static const char * xml = "<results>"
"<result><url>http://ya.ru</url><description>Yandex</descri...
"<result><url>http://google.com</url><description>Google</d...
"</results>";

int main (int argc, char * argv[]) {
    xmlDocPtr document;
    xmlNodePtr root_node, node, child;
    char url[1024], description[1024];
    
    LIBXML_TEST_VERSION
    
    document = xmlReadMemory (xml, strlen (xml), "notexist.xml", NULL, 0);
    if (!document) {
        fprintf (stderr, "Failed to parse...\n");
        exit (-1);
    }
    
    root_node = xmlDocGetRootElement (document);
    // Перебор тегов <result>
    for (node = root_node->children; node; node = node->next) {
          // Перебор дочерних тегов
        for (child = node->children; child; child = child->next) {
            if (!strcmp (child->name, "url"))
                strcpy (url, xmlNodeGetContent (child->children));
            if (!strcmp (child->name, "description"))
                strcpy (description, xmlNodeGetContent (child->children));
        }
        printf ("%s %s\n", url, description);
    }
    
    xmlFreeDoc (document);
    
    xmlCleanupParser ();
}
--xmltest.c--

Компилировать gcc `xml2-config --libs --cflags` -o xmltest xmltest.c

Код, мягко говоря, далек от совершенства ;) Но пример дает...


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 01-Июл-04 19:54 
>Ну... надеюсь, это поможет (для libxml2)

>Компилировать gcc `xml2-config --libs --cflags` -o xmltest xmltest.c
>
>Код, мягко говоря, далек от совершенства ;) Но пример дает...

Доброго времени суток, StingFire.
Спасибо огромное.
Но -((;
При компиляции вообще не ругается, но при попытке запуска говорит следующее
[root@websitebuilder work]# ./parse
Warning: program compiled against libxml 206 using older 205
./parse: relocation error: ./parse: undefined symbol: xmlReadMemory

Подскажи плиз, если можешь.
Спасибо.


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 01-Июл-04 16:54 
>Скачать там же.

Извини за ламерство, но что именно я должен скачать?(Адрес. Не могу найти на сайте).


"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 01-Июл-04 17:35 
>Извини за ламерство, но что именно я должен скачать?(Адрес. Не могу найти
>на сайте).
http://xmlsoft.org/sources/
Что-то типа libxml2-2.6.0.tar.gz
Или rpm, если redhat.



"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 01-Июл-04 17:37 
>Что-то типа libxml2-2.6.0.tar.gz
Гоню, качай 2.6.10. Или 2.6.9, у меня эта версия стоит, работает нормально.



"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 01-Июл-04 19:04 
>Что-то типа libxml2-2.6.0.tar.gz
>Или rpm, если redhat.

то ли руки не оттуда, то ли с машиной не лады, хотя мож я прсто не знаю чего-то...
Короче.
Скачал *2.6.9.rpm(спасибо), дал команду rpm -i 2.6.9.rpm, вроде всё ок. Говорю gcc parse.c.
Код parse.c:

#include <stdio.h>
#include <libxml/xmlreader.h>

main(){return;}

Получил ответ:parce.c:2:30: libxml/xmlreader.h: No such file or directory

Качаю *tar.gz, распаковываю, ./configure, make, make install.
gcc parse.c - тот же ответ.

Мож что не так делаю?
Подскажи, плиз.

Спасибо.


"Помогите!!! Нужен парсер XML на C"
Отправлено ihor , 01-Июл-04 20:03 
1)
/* ------------- */
#include <stdio.h>
#include "xmlreader.h"

main(){return;}
/* ------------- */
2) gcc -L/path/to/xml/library -I/path/to/xml/includes -o parse parse.c
где /path/to/xml/library -- путь к каталогу, куда стали бинарники библиотеки, а /path/to/xml/includes -- путь, где лежат *.h файлы библиотеки


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 11:35 
>2) gcc -L/path/to/xml/library -I/path/to/xml/includes -o parse parse.c
>где /path/to/xml/library -- путь к каталогу, куда стали бинарники библиотеки, а /path/to/xml/includes
>-- путь, где лежат *.h файлы библиотеки

Спасибо.
Если можешь скажи, что сие означает?
[root@websitebuilder work]# gcc -L/script/newnew/libxml2-2.6.9/.lib -lxml2 -lz -lpthread -lm -I/script/newnew/libxml2-2.6.9/include -o parse parse.c
/tmp/ccQzm6ow.o(.text+0x48): In function `main':
: undefined reference to `xmlReadMemory'
collect2: ld returned 1 exit status

код

#include <libxml/parser.h>
#include <stdio.h>

static const char * xml = "<results>"
"<result><url>http://ya.ru</url><description>Yandex</descri...
"<result><url>http://google.com</url><description>Google</d...
"</results>";

int main (int argc, char * argv[]) {
xmlDocPtr document;
xmlNodePtr root_node, node, child;
char url[1024], description[1024];

LIBXML_TEST_VERSION

document = xmlReadMemory (xml, strlen (xml), "notexist.xml", NULL, 0);
if (!document) {
fprintf (stderr, "Failed to parse...\n");
exit (-1);
}

root_node = xmlDocGetRootElement (document);
// Перебор тегов <result>
for (node = root_node->children; node; node = node->next) {
      // Перебор дочерних тегов
for (child = node->children; child; child = child->next) {
if (!strcmp (child->name, "url"))
strcpy (url, xmlNodeGetContent (child->children));
if (!strcmp (child->name, "description"))
strcpy (description, xmlNodeGetContent (child->children));
}
printf ("%s %s\n", url, description);
}

xmlFreeDoc (document);

xmlCleanupParser ();
}


"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 02-Июл-04 08:30 
1. Попробуй запустить ldconfig, после этого пересобрать и запустить
2. Запусти ldconfig -v и посмотри, где он находит libxml2.so.*
3. Запусти xml2-config --libs --cflags и посмотри, какие он пути "рекомендует". (после -I и -L). Сравни с пунктом 2.

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


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 12:04 
>1. Попробуй запустить ldconfig, после этого пересобрать и запустить
>2. Запусти ldconfig -v и посмотри, где он находит libxml2.so.*
>3. Запусти xml2-config --libs --cflags и посмотри, какие он пути "рекомендует". (после
>-I и -L). Сравни с пунктом 2.
>
>Похоже, что у тебя libxml2 уже стояла, причем версии поменьше... и в
>другой папке...

Пересобрать и запустить библиотеку, если я тебя правильно понял(в смысле я сделал ldconfig, ./configure, make, make install).
Ничего не изменилось.
Запустил ldconfig -v
Запустил xml2-config --libs --cflags

Пути не совпали. Я указал компилятору, где искать(вроде так)

[root@websitebuilder work]# gcc -L/script/newnew/libxml2-2.6.9/.lib -lxml2 -lz -lpthread -lm -I/script/newnew/libxml2-2.6.9/include -o parse parse.c
/tmp/cc23x99z.o(.text+0x48): In function `main':
: undefined reference to `xmlReadMemory'
collect2: ld returned 1 exit status
[root@websitebuilder work]#

Компилировал твой код. С этой ошибкой парюсь со вчерашнего дня. Тем или иным путём прихожу к ней. Было так же, когда я попытался установть
expat :(((. Пытаюсь скомпилить примеры expat - выскакивает эта ошибка. Если знаешь в чём дело или есть какие нить идеи, скажи, буду признателен за любую помощь.

Спасибо.


"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 02-Июл-04 12:30 
>Если можешь скажи, что сие означает?
>[root@websitebuilder work]# gcc -L/script/newnew/libxml2-2.6.9/.lib -lxml2 -lz -lpthread -lm -I/script/newnew/libxml2-2.6.9/include -o parse parse.c
Сообщение означает, что линкер не может найти файл библиотеки. Ошибка в том, что ты патаешься
указать компилятору путь к месту, где ты собирал библиотеку. То есть он пытается найти
файл /script/newnew/libxml2-2.6.9/.lib/libxml2.la. Не находит, потому что не .lib, а .libs.
Это-факты. А теперь предположения.
1. libxml2 у тебя уже стояла, но версии более старой. Об этом говорит сообщение
Warning: program compiled against libxml 206 using older 205. При этом она стояла в каталоге
/usr/lib (проверь командой ls /usr/lib/libxml*). В имени файла увидишь версию. Соответственно,
.h лежат в /usr/include.
2. libxml версии 2.6.9 поставилась в каталог /usr/local/lib. .h лежат в /usr/local/include.
Проверить ls /usr/local/lib/libxml*
3. xml2-config у тебя тоже 2 - от старой и от новой. Один в /usr/bin, второй - в /usr/local/bin.
Проверить можно whereis xml2-config.
Одна из функций xml2-config - выдавать правильные ключи для gcc. Если запустить
его с ключами --libs --cflags, как раз оно и получится. Поэтому надо писать не gcc -L... -I... -l...,
а gcc `xml2-config --libs --cflags`. НО! поскольку у тебя в переменной PATH стоит сначала /usr/bin,
а потом - /usr/local/bin, то - вызывается старый xml2-config. Попробуй писать с путем
/usr/local/bin/xml2-config --libs --cflags. Должен указать на /usr/local/lib.
Если мои предположения верны, тебе нужно удалить /usr/bin/xml2-config, /usr/lib/libxml*,
/usr/include/libxml2
а потом запустить ldconfig -v | less и удостовериться, что он нашел библиотеки в /usr/local/lib.
И напиши, помогло или нет... Первый раз телепатом работаю :)
PS ldconfig надо запускать после установки библиотек... любых...

"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 02-Июл-04 12:36 
>а gcc `xml2-config --libs --cflags`. НО! поскольку у тебя в переменной PATH
>стоит сначала /usr/bin,
>а потом - /usr/local/bin, то - вызывается старый xml2-config. Попробуй писать с
>путем
>/usr/local/bin/xml2-config --libs --cflags. Должен указать на /usr/local/lib.
Возможен еще вариант, что вызывается новый xml2-config, программа компилится с новой версией, а запускается со старой. Лечить так же, удалением старой, запуском ldconfig. И проверь, есть ли у тебя /usr/local/lib в /etc/ld.so.conf

"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 14:23 
>Если мои предположения верны, тебе нужно удалить /usr/bin/xml2-config, /usr/lib/libxml*,
>/usr/include/libxml2
>а потом запустить ldconfig -v | less и удостовериться, что он нашел
>библиотеки в /usr/local/lib.
>И напиши, помогло или нет... Первый раз телепатом работаю :)
>PS ldconfig надо запускать после установки библиотек... любых...

Во первых, хочу тебе сказать, что телепат из тебя хороший, спасибо. Всё как ты сказал. Дейсвительно, была библиотека 2.5.х, было 2 xml2-config(там, где ты сказал) (и ещё один в манах гз ноя так понял - это не важно). Попробовал написать вместо gcc 'xml2-config --xx --xx' gcc '/usr/local/bin/xml2-config --xx --xx' - сказал no such file or directory.
Проверил путь(стыдно за .lib вместо .libs:)) - в этот раз вроде првильный.Удалил по твоему совету файлы. Запустил ldconfig -v | less. Он не нашёл директорию с файлами библиотеки('/usr/local/lib'). Видно не судьба.
Удалил из /usr/local те же файлы, что и из /usr.
Прочитал твоё новое сообщение. Да, запускался новый хмл-конфиг(--version выдал 2.6.9). У меня нет пути /usr/local/lib в етс/ld.so.conf. Думаю добавлять уже смысла нету.
Переустановил библиотеку.
[root@websitebuilder libxml2-2.6.9]# whereis xml2-config
xml2-config: /usr/local/bin/xml2-config /usr/share/man/man1/xml2-config.1.gz
Думаю, есть смысл добавить в етс путь. Добавил.(Почему библиотека не встала в /usr?).
ldconfig -v
Он нашёл путь. Пробую компилить пример(твой).
Скомпилил. Запускаю.
Уррррррррррррррррррррррррраааааааааааааааааааааааааааааааааааааааа!!!!!!
Спасибо те огромное.
Кстати, почему всё-таки библиотека встала в /usr/local а не в /usr?
И ещё, если тебе не жалко, кинь мне своё мыло на jarunda@mail.ru, я тебе своё кину. Вдруг у меня ещё вопросы возникнут, а кто лучше ответит удалённому пользователю чем телепат?;-)). Обещаю не надоедать и не слать рекламу.
Спасибо.


"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 02-Июл-04 15:02 
>Кстати, почему всё-таки библиотека встала в /usr/local а не в /usr?
./configure --prefix=/usr
Только зачем?

"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 15:28 
>>Кстати, почему всё-таки библиотека встала в /usr/local а не в /usr?
>./configure --prefix=/usr
>Только зачем?

Просто интересно. Если первая встала в /usr, то логично, на мой взгляд, что если следующей ничто не мешало, то она должна была по умолчанию встать в /usr. Значит, что-то мешало. Интересно, что? Или я не прав?



"Помогите!!! Нужен парсер XML на C"
Отправлено StingFire , 02-Июл-04 16:35 
>Просто интересно. Если первая встала в /usr, то логично, на мой взгляд,
>что если следующей ничто не мешало, то она должна была по
>умолчанию встать в /usr. Значит, что-то мешало. Интересно, что? Или я
>не прав?
Она встанет в тот каталог, который ей скажешь, вне зависимости, была там старая версия или нет. По умолчанию (./configure --help) - /usr/local.
А разработчики твоего дистрибутива решили, что ей место в /usr.


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 17:37 
Почему когда в твоём коде добавляешь строку типа
static const char * xml = "<? xml version \"1.0.\" ?" ...;
он ругается следующими словами
[root@websitebuilder work]# ./parse
notexist.xml:1: parser error : parsing XML declaration: '?>' expected
<?xml version="1.0" ?<results><result><url>http://ya.ru</url><description>Yandex
                    ^
notexist.xml:1: parser error : Extra content at the end of the document
esults><result><url>http://ya.ru</url><description>Yandex</descri...
                                                                               ^
Failed to parse...

Эта строка встречается в каждом хмл-нике.
Что ему не нравиться? Мож убирать эту строку ручками?


"Помогите!!! Нужен парсер XML на C"
Отправлено Андрей , 02-Июл-04 18:24 
>он ругается следующими словами

Глупый вопрос, извиняюсь. Устал наверное.


"Помогите!!! Нужен парсер XML на (C++) !!!!!!!"
Отправлено fry , 11-Мрт-05 13:00 
nujen subj
plizzzzzzzzzz
!!!!!!!!!!!!!!!!!!!

"Помогите!!! Нужен парсер XML на (C++) !!!!!!!"
Отправлено Дениска , 11-Мрт-05 13:02 
expat не подойдет?

"Помогите!!! Нужен парсер XML на (C++) !!!!!!!"
Отправлено Andrey , 11-Мрт-05 20:47 
>nujen subj
>plizzzzzzzzzz
>!!!!!!!!!!!!!!!!!!!


Я пользовался libxml2, но это на c, а не на си++. Мне тогда помог Тимур(stingfire, кажется). Парсер написал успешно. Если нужна помощь -- пиши.