xmlNodeGetContent возвращает content дочерних узлов (libxml2)

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

А как получить content только нужного узла?
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение d_n_k »

xpath знаешь?
читай доки по либ xml как получить значение в libxml2 по xpath
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

d_n_k писал(а):
26.08.2007 01:26
xpath знаешь?
читай доки по либ xml как получить значение в libxml2 по xpath

Хм... посмотрю на xpath...
Я, что-то, дальше раздела tree не заглядывал...
А вообще, доки там, конечно, довольно уродски организованы. Хотя и подробные.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение v04bvs »

Ты наверное не до конца врубился в XML.
<a>abc<b>def</b>ghi</a>
здесь такая структура:

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

УЗЕЛ                    ЗНАЧЕНИЕ
a                       NULL
+-#Text                 abc
+-b                     NULL
| +-#Text               def
+-#Text                 ghi
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

Посмотрел на раздел XPath libxml и что-то не понял, как это связано с content'ом узла.
Там какая-то куча функций приведения типов одного в другое и всякие context'ы.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

v04bvs писал(а):
26.08.2007 12:26
Ты наверное не до конца врубился в XML.

"Я русский язык не хорошо понимаю" (с) Мимино :tongue:

Ну, в смысле, действительно XML знаю только на уровне: придумать структуру для конфига своей программы и читать её.
Всякие там определения, DTD какие-то, ELEMENT - короче, из толстой книжки (500 страниц) про XML я знаю хорошо если 30-50 :rolleyes:

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 :mellow:
Фигня какая-то...
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение v04bvs »

У обычного узла, который может иметь потомков - нет никакого содержимого. Содержимое есть у специальных текстовых узлов. Их тебе надо искать (по nodeType-у) и брать их содержимое.

Кстати про DTD почитай тоже, будет проще с пробелами работать.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

v04bvs писал(а):
26.08.2007 17:12
У обычного узла, который может иметь потомков - нет никакого содержимого. Содержимое есть у специальных текстовых узлов. Их тебе надо искать (по nodeType-у) и брать их содержимое.


А вот в примерах к libxml есть такие XML'ины (примерно, по памяти):

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

<node1>
 abc
 <node2>def</node2>
</node1>


И libxml2 выдаёт content'ы:
для node2 - как и положено: def
А для node1 что-то вроде:
abc

def
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение v04bvs »

если ты хочешь увидеть abc, тебе надо брать content у первого child-а узла node1.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

v04bvs писал(а):
26.08.2007 21:08
если ты хочешь увидеть abc, тебе надо брать content у первого child-а узла node1.

Не, у child'ов всё нормально - у них свой content (def в нашем примере).
Но почему-то в libxml2 так сделано, что их content выводится и у родителя.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение d_n_k »

выдается все правильно.

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 дочерних узлов

Сообщение Zeus »

Я знаю, что правильно выдаётся, что в соответствии с документацией.
Но мне этот бред (контент родителя содержит контенты всех потомков) - не нужен.

Всё-таки хотел бы через xml tree сделать. Мне эта идеология как-то ближе.
В XPath я как-то не очень вник.

У меня задача стоИт "прошерстить" весь документ, не зная названия узлов.
А тут - first, second...
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение d_n_k »

если не известна стуктура документа, то xpath ни как не поможет.

тогда остается только тупо обходить весь документ с помощью DOM- или Sax-парсера.
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

d_n_k писал(а):
27.08.2007 11:14
тогда остается только тупо обходить весь документ с помощью DOM- или Sax-парсера.

Я это и делаю (xml tree - DOM, короче).
Но вот стандартная функция, которая возвращает content узла работает так вот странно. Точнее, её так странно запрограммировали разработчики библиотеки.

А кто-нибудь знает как всё-таки получить content именно нужного узла?
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение d_n_k »

что есть нужны узел, если ты не знаешь структуру документа. те ты не можешь сказать 5-ый слева относительно 6-ого твой или нет?

так все таки ны знаешь структуру документа или нет?

если знаешь смотри мой код, если нет - телепаты сам-занешь-где.


http://student.santarosa.edu/~dturover/?node=libxml2
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

Я делаю вот это.
Т.е. перелопачиваю libxml2 tree в удобную мне структуру.
И столкнулся с проблемой content'а узла.

Мне, правда, тут подсказали уже немного - если это верное направление, то отпишусь.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение v04bvs »

Вообще ты странным делом занимаешься.. Есть стандарты парсеров - DOM, SAX. Есть библиотеки, эти стандарты реализующие. Дело конечно твоё, но я лично знаю DOM и SAX, использую их в 4 языках (C++, D, Java, JavaScript), и не буду использовать библиотеку для XML, которая выдумывает свои стандарты.

PS я бы перед тем, как писать библиотеку для XML, проботал стандарт наизусть.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

v04bvs писал(а):
28.08.2007 19:20
Вообще ты странным делом занимаешься.. Есть стандарты парсеров - DOM, SAX. Есть библиотеки, эти стандарты реализующие. Дело конечно твоё, но я лично знаю DOM и SAX, использую их в 4 языках (C++, D, Java, JavaScript), и не буду использовать библиотеку для XML, которая выдумывает свои стандарты.

А я и не для кого-то либу пишу, а для себя. Причём если бы не этот идиотский затык - она была бы закончена за один вечер.

Стандарты стандартами, но это только слова.
А реализация в виде библиотек меня не устраивает.
В частности, мне не нравятся всякие лишние типы данных.
Скажешь они тоже в стандарте прописаны?
А почему тогда они от библиотеке к библиотеки отличаются?
Есть libxml2, а есть libxml++
Сильно разные, для программиста, вещи. Кто-то из них не соответствует стандарту?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

Короче, вчера сел и банально, с TABами, количеством, соответствующим вложенности узла, вывел на экран libxml2::tree
Выяснилось, что content узла хранится в child'ах в виде TEXT_NODE. Хениально они свойство узла поместили в список его потомков :dry:

Ну и ещё получается, что у ЛЮБОГО узла есть content, который содержит все символы от xml-тэга этого узла до xml-тега его первого потомка.
Может, конечно, это и соответствует спецификации... чего там, DOM или XML? - но это не то, что я ожидал.
Ладно, разберёмся.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение v04bvs »

Zeus писал(а):
30.08.2007 09:56
Короче, вчера сел и банально, с TABами, количеством, соответствующим вложенности узла, вывел на экран libxml2::tree
Выяснилось, что content узла хранится в child'ах в виде TEXT_NODE. Хениально они свойство узла поместили в список его потомков :dry:

Ну и ещё получается, что у ЛЮБОГО узла есть content, который содержит все символы от xml-тэга этого узла до xml-тега его первого потомка.
Может, конечно, это и соответствует спецификации... чего там, DOM или XML? - но это не то, что я ожидал.
Ладно, разберёмся.

А если бы ты внимательно читал то, что я тебе писал, ты бы понял это гораздо раньше :)
А если тебе не нравятся пробелы и переводы строки - читай про DTD (или XML Schema).
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: xmlNodeGetContent возвращает content дочерних узлов

Сообщение Zeus »

v04bvs писал(а):
30.08.2007 10:34
А если бы ты внимательно читал то, что я тебе писал, ты бы понял это гораздо раньше :)
А если тебе не нравятся пробелы и переводы строки - читай про DTD (или XML Schema).

Ну, в общем, да. Посмотрел сейчас - было такое в этой теме. Но тогда я это не так понял.
Про XML ещё почитаю.
Спасибо сказали: