Доброго времени суток.Скачал парсер expat. Установил под линукс. Он работает и что-то парсит, но я не пойму как использовать не готовую программу а исходный код в своей программе. Читал документацию, возникают большие трудности с пониманием - английский знаю очень плохо. Если кто знает как использовать этот или любой другой парсер, пжалуйста, подскажите или дайте ссылку.
Спасибо.
Помогите
IMHO lixml лучше, чем expat. Работает быстрее и стабильнее.
Примеры работы с ним можешь почитать на http://www.xmlsoft.org/examples/index.html
Скачать там же.
Изложи проблему подробнее, не совсем понятно, тебе надо просто XML парсить?
>Изложи проблему подробнее, не совсем понятно, тебе надо просто XML парсить?Излагаю подробнее. Есть прграмка на С, которая запрашивает у сервера XML страничку с результатом поиска слова(н-р sex), после получения странички её надо представит в удобном виде, типа
url&&то, что в теге2(н-р description),...\n
url&&то, что в теге2(н-р description),...\nи записать в файл.
Вот и всё.
Но с разбором проблемы. Писать такую процедурку самому - гемор. Посоветовали найти готовый парсер. Дальше знаешь.
Помоги, если можешь.Спасибо.
Ну... надеюсь, это поможет (для 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
Код, мягко говоря, далек от совершенства ;) Но пример дает...
>Ну... надеюсь, это поможет (для 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Подскажи плиз, если можешь.
Спасибо.
>Скачать там же.Извини за ламерство, но что именно я должен скачать?(Адрес. Не могу найти на сайте).
>Извини за ламерство, но что именно я должен скачать?(Адрес. Не могу найти
>на сайте).
http://xmlsoft.org/sources/
Что-то типа libxml2-2.6.0.tar.gz
Или rpm, если redhat.
>Что-то типа libxml2-2.6.0.tar.gz
Гоню, качай 2.6.10. Или 2.6.9, у меня эта версия стоит, работает нормально.
>Что-то типа 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 - тот же ответ.Мож что не так делаю?
Подскажи, плиз.Спасибо.
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 файлы библиотеки
>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 ();
}
1. Попробуй запустить ldconfig, после этого пересобрать и запустить
2. Запусти ldconfig -v и посмотри, где он находит libxml2.so.*
3. Запусти xml2-config --libs --cflags и посмотри, какие он пути "рекомендует". (после -I и -L). Сравни с пунктом 2.Похоже, что у тебя libxml2 уже стояла, причем версии поменьше... и в другой папке...
>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 - выскакивает эта ошибка. Если знаешь в чём дело или есть какие нить идеи, скажи, буду признателен за любую помощь.Спасибо.
>Если можешь скажи, что сие означает?
>[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 надо запускать после установки библиотек... любых...
>а 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
>Если мои предположения верны, тебе нужно удалить /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, я тебе своё кину. Вдруг у меня ещё вопросы возникнут, а кто лучше ответит удалённому пользователю чем телепат?;-)). Обещаю не надоедать и не слать рекламу.
Спасибо.
>Кстати, почему всё-таки библиотека встала в /usr/local а не в /usr?
./configure --prefix=/usr
Только зачем?
>>Кстати, почему всё-таки библиотека встала в /usr/local а не в /usr?
>./configure --prefix=/usr
>Только зачем?Просто интересно. Если первая встала в /usr, то логично, на мой взгляд, что если следующей ничто не мешало, то она должна была по умолчанию встать в /usr. Значит, что-то мешало. Интересно, что? Или я не прав?
>Просто интересно. Если первая встала в /usr, то логично, на мой взгляд,
>что если следующей ничто не мешало, то она должна была по
>умолчанию встать в /usr. Значит, что-то мешало. Интересно, что? Или я
>не прав?
Она встанет в тот каталог, который ей скажешь, вне зависимости, была там старая версия или нет. По умолчанию (./configure --help) - /usr/local.
А разработчики твоего дистрибутива решили, что ей место в /usr.
Почему когда в твоём коде добавляешь строку типа
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...Эта строка встречается в каждом хмл-нике.
Что ему не нравиться? Мож убирать эту строку ручками?
>он ругается следующими словамиГлупый вопрос, извиняюсь. Устал наверное.
nujen subj
plizzzzzzzzzz
!!!!!!!!!!!!!!!!!!!
expat не подойдет?
>nujen subj
>plizzzzzzzzzz
>!!!!!!!!!!!!!!!!!!!
Я пользовался libxml2, но это на c, а не на си++. Мне тогда помог Тимур(stingfire, кажется). Парсер написал успешно. Если нужна помощь -- пиши.