xmlNodeGetContent возвращает content дочерних узлов (libxml2)
Модератор: Модераторы разделов
-
Zeus
- Сообщения: 694
xmlNodeGetContent возвращает content дочерних узлов
А как получить content только нужного узла?
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
xpath знаешь?
читай доки по либ xml как получить значение в libxml2 по xpath
читай доки по либ xml как получить значение в libxml2 по xpath
все сказанное есть имхо...
-
Zeus
- Сообщения: 694
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
Ты наверное не до конца врубился в XML.
<a>abc<b>def</b>ghi</a>
здесь такая структура:
<a>abc<b>def</b>ghi</a>
здесь такая структура:
Код: Выделить всё
УЗЕЛ ЗНАЧЕНИЕ
a NULL
+-#Text abc
+-b NULL
| +-#Text def
+-#Text ghi-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Посмотрел на раздел XPath libxml и что-то не понял, как это связано с content'ом узла.
Там какая-то куча функций приведения типов одного в другое и всякие context'ы.
Там какая-то куча функций приведения типов одного в другое и всякие context'ы.
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
"Я русский язык не хорошо понимаю" (с) Мимино
Ну, в смысле, действительно XML знаю только на уровне: придумать структуру для конфига своей программы и читать её.
Всякие там определения, DTD какие-то, ELEMENT - короче, из толстой книжки (500 страниц) про XML я знаю хорошо если 30-50
v04bvs писал(а): ↑26.08.2007 12:26<a>abc<b>def</b>ghi</a>
здесь такая структура:
Код: Выделить всё
УЗЕЛ ЗНАЧЕНИЕ a NULL +-#Text abc +-b NULL | +-#Text def +-#Text ghi
Я бы сказал, что "не до конца врубился" уже не в XML, а в твой пример...
Но если взять его за основу, то объясню проблему:
Если "спросить" у libxml content узла a, то получишь что-то вроде:
"abc
def
ghi"
И в доке так и написано, что эта функция так и работает.
Вот тут так написано.
Кстати, а что значит TEXT node? В XML может быть двоичный node?
Вот вопрос у меня и заключается в следующем: зачем мне, если я интересуюсь содержимым узла, показывать содержимое всех его дочерних узлов?
Пытался безо всяких функций - тупо взять xmlNode и посмотреть его структуру данных.
Там есть xmlChar *content, однако его значение у всех узлов - 0
Фигня какая-то...
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
У обычного узла, который может иметь потомков - нет никакого содержимого. Содержимое есть у специальных текстовых узлов. Их тебе надо искать (по nodeType-у) и брать их содержимое.
Кстати про DTD почитай тоже, будет проще с пробелами работать.
Кстати про DTD почитай тоже, будет проще с пробелами работать.
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
А вот в примерах к libxml есть такие XML'ины (примерно, по памяти):
Код: Выделить всё
<node1>
abc
<node2>def</node2>
</node1>И libxml2 выдаёт content'ы:
для node2 - как и положено: def
А для node1 что-то вроде:
abc
def
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
если ты хочешь увидеть abc, тебе надо брать content у первого child-а узла node1.
-
Zeus
- Сообщения: 694
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
выдается все правильно.
http://student.santarosa.edu/~dturover/?node=libxml2
http://student.santarosa.edu/~dturover/?node=libxml2
Код: Выделить всё
int main(void)
{
char msg[] = "<?xml version=\"1.0\"?>\n<first>\n<second>\n<third>value\n<x>test</x>53454\n</third>\n</second></first>\n";
printf("%s\n",msg);
xmlDoc *doc = NULL;
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
LIBXML_TEST_VERSION
doc = xmlReadMemory(msg, sizeof(msg), "noname.xml", NULL,
XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_RECOVER);
if (doc == NULL) {
fprintf(stderr, "Failed!\n");
return (-1);
}
context = xmlXPathNewContext(doc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
return 2;
}
xmlXPathRegisterNs(context, "xyz", "xxx:yyy:zzz");
result = xmlXPathEval((xmlChar*)"/first/second/third", context);
xmlXPathFreeContext(context);
if (result == NULL) {
printf("Error in xmlXPathEval\n");
return 2;
}
if (result->type == XPATH_NODESET)
{
if(xmlXPathNodeSetIsEmpty(result->nodesetval))
{
printf("No result\n");
}
else
{
printf("third=%s\n",
xmlXPathCastNodeSetToString(result->nodesetval));
printf("\n");
int i;
for (i=0; i < result->nodesetval->nodeNr; i++)
{
xmlChar* keyword = xmlNodeListGetString(doc, result->nodesetval->nodeTab[i]->xmlChildrenNode, 1);
printf("keyword: %s\n-----\n", keyword);
xmlFree(keyword);
}
}
}
xmlXPathFreeObject(result);
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
return (0);
}все сказанное есть имхо...
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Я знаю, что правильно выдаётся, что в соответствии с документацией.
Но мне этот бред (контент родителя содержит контенты всех потомков) - не нужен.
Всё-таки хотел бы через xml tree сделать. Мне эта идеология как-то ближе.
В XPath я как-то не очень вник.
У меня задача стоИт "прошерстить" весь документ, не зная названия узлов.
А тут - first, second...
Но мне этот бред (контент родителя содержит контенты всех потомков) - не нужен.
Всё-таки хотел бы через xml tree сделать. Мне эта идеология как-то ближе.
В XPath я как-то не очень вник.
У меня задача стоИт "прошерстить" весь документ, не зная названия узлов.
А тут - first, second...
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
если не известна стуктура документа, то xpath ни как не поможет.
тогда остается только тупо обходить весь документ с помощью DOM- или Sax-парсера.
тогда остается только тупо обходить весь документ с помощью DOM- или Sax-парсера.
все сказанное есть имхо...
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Я это и делаю (xml tree - DOM, короче).
Но вот стандартная функция, которая возвращает content узла работает так вот странно. Точнее, её так странно запрограммировали разработчики библиотеки.
А кто-нибудь знает как всё-таки получить content именно нужного узла?
-
d_n_k
- Сообщения: 636
- ОС: Gentoo GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
что есть нужны узел, если ты не знаешь структуру документа. те ты не можешь сказать 5-ый слева относительно 6-ого твой или нет?
так все таки ны знаешь структуру документа или нет?
если знаешь смотри мой код, если нет - телепаты сам-занешь-где.
http://student.santarosa.edu/~dturover/?node=libxml2
так все таки ны знаешь структуру документа или нет?
если знаешь смотри мой код, если нет - телепаты сам-занешь-где.
http://student.santarosa.edu/~dturover/?node=libxml2
все сказанное есть имхо...
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Я делаю вот это.
Т.е. перелопачиваю libxml2 tree в удобную мне структуру.
И столкнулся с проблемой content'а узла.
Мне, правда, тут подсказали уже немного - если это верное направление, то отпишусь.
Т.е. перелопачиваю libxml2 tree в удобную мне структуру.
И столкнулся с проблемой content'а узла.
Мне, правда, тут подсказали уже немного - если это верное направление, то отпишусь.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
Вообще ты странным делом занимаешься.. Есть стандарты парсеров - DOM, SAX. Есть библиотеки, эти стандарты реализующие. Дело конечно твоё, но я лично знаю DOM и SAX, использую их в 4 языках (C++, D, Java, JavaScript), и не буду использовать библиотеку для XML, которая выдумывает свои стандарты.
PS я бы перед тем, как писать библиотеку для XML, проботал стандарт наизусть.
PS я бы перед тем, как писать библиотеку для XML, проботал стандарт наизусть.
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
v04bvs писал(а): ↑28.08.2007 19:20Вообще ты странным делом занимаешься.. Есть стандарты парсеров - DOM, SAX. Есть библиотеки, эти стандарты реализующие. Дело конечно твоё, но я лично знаю DOM и SAX, использую их в 4 языках (C++, D, Java, JavaScript), и не буду использовать библиотеку для XML, которая выдумывает свои стандарты.
А я и не для кого-то либу пишу, а для себя. Причём если бы не этот идиотский затык - она была бы закончена за один вечер.
Стандарты стандартами, но это только слова.
А реализация в виде библиотек меня не устраивает.
В частности, мне не нравятся всякие лишние типы данных.
Скажешь они тоже в стандарте прописаны?
А почему тогда они от библиотеке к библиотеки отличаются?
Есть libxml2, а есть libxml++
Сильно разные, для программиста, вещи. Кто-то из них не соответствует стандарту?
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Короче, вчера сел и банально, с TABами, количеством, соответствующим вложенности узла, вывел на экран libxml2::tree
Выяснилось, что content узла хранится в child'ах в виде TEXT_NODE. Хениально они свойство узла поместили в список его потомков
Ну и ещё получается, что у ЛЮБОГО узла есть content, который содержит все символы от xml-тэга этого узла до xml-тега его первого потомка.
Может, конечно, это и соответствует спецификации... чего там, DOM или XML? - но это не то, что я ожидал.
Ладно, разберёмся.
Выяснилось, что content узла хранится в child'ах в виде TEXT_NODE. Хениально они свойство узла поместили в список его потомков
Ну и ещё получается, что у ЛЮБОГО узла есть content, который содержит все символы от xml-тэга этого узла до xml-тега его первого потомка.
Может, конечно, это и соответствует спецификации... чего там, DOM или XML? - но это не то, что я ожидал.
Ладно, разберёмся.
-
v04bvs
- Сообщения: 636
- ОС: Debian GNU/Linux
Re: xmlNodeGetContent возвращает content дочерних узлов
Zeus писал(а): ↑30.08.2007 09:56Короче, вчера сел и банально, с TABами, количеством, соответствующим вложенности узла, вывел на экран libxml2::tree
Выяснилось, что content узла хранится в child'ах в виде TEXT_NODE. Хениально они свойство узла поместили в список его потомков![]()
Ну и ещё получается, что у ЛЮБОГО узла есть content, который содержит все символы от xml-тэга этого узла до xml-тега его первого потомка.
Может, конечно, это и соответствует спецификации... чего там, DOM или XML? - но это не то, что я ожидал.
Ладно, разберёмся.
А если бы ты внимательно читал то, что я тебе писал, ты бы понял это гораздо раньше
А если тебе не нравятся пробелы и переводы строки - читай про DTD (или XML Schema).
-
Zeus
- Сообщения: 694
Re: xmlNodeGetContent возвращает content дочерних узлов
Ну, в общем, да. Посмотрел сейчас - было такое в этой теме. Но тогда я это не так понял.
Про XML ещё почитаю.