libxml - перебирает всех детей ребенка - PullRequest
1 голос
/ 31 марта 2011

Я новичок в libxml. Я хотел бы написать 1 цикл, чтобы пройти через все дочерние элементы дочернего узла и т. Д., Например,

<par>i want to <bold>loop <italic>through </italic> all</bold> children in this node</pa г>

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

    if (xmlStrEqual(node->name, BAD_CAST "p")) {

    xmlNodePtr child = node->children;

        while (child != NULL) {

            child = child->next;
        }
    }

Вполне возможно, что структура узла может вырасти до 4-5 элементов, поэтому мне нужно более надежное решение, чем размещение циклов while внутри циклов while. Любая помощь будет оценена, пожалуйста.

1 Ответ

1 голос
/ 09 апреля 2011

Используемый вами интерфейс xmlTree является иерархическим. имеет 3 детей - текст до , сам и текст после. имеет своих детей, включая . Список node-> children содержит только немедленные дочерние элементы узла.

Есть пара способов получить желаемое поведение.

  • При обработке child вы можете рекурсивно обработать child-> children для получения дочернего элемента , который включает

  • Если вы ищете ОСОБЕННО для этого (или для набора определенных узлов), вы можете использовать выражение XPath, такое как «par // italic», чтобы найти любой курсивный узел где-нибудь ниже par , http://www.xmlsoft.org/examples/index.html#XPath

  • Вы можете взглянуть на интерфейс xmlTextReader в libxml2, а не на xmlTree. Он обеспечивает последовательное «чтение» документа, который вы ожидаете. http://xmlsoft.org/xmlreader.html

Каждый метод имеет свои преимущества / недостатки, в зависимости от того, что вы пытаетесь сделать со своим приложением.

...