Почему libxml2 выводит «текст» по имени элемента (если это не «текст»)? - PullRequest
2 голосов
/ 13 августа 2010

Я использую libxml2 для разбора XML. Пример кода на веб-сайте libxml труден для восприятия, и в нем, похоже, отсутствуют некоторые детали. Я пришел к следующему коду от Googling, так что я даже не думаю, что это правильный способ сделать это, но он работал в написанной мной программе обучения, но не в этой. Я до сих пор не знаю, как правильно использовать libxml в C ++, поэтому я работаю в темноте и надеюсь, что у меня получится что-то полезное.

Файл XML загружается правильно, и когда эта функция выводит root->name правильно, но затем, когда он проходит через дочерние элементы, он просто выводит text при cur->name, и я не знаю почему. Я должен поставить там счетчик, чтобы он не входил в бесконечный цикл. Я читал где-то пробел в XML-файле может вызвать это, но я не знаю, что делать. Я просто хочу название детали и идентификатор.

xmlNode *cur = root;
cur = cur->xmlChildrenNode;

ofstream out;
out.open("errorlog.txt", ios::app);
out << "attempting reading current node\n";
out << "root: " << root->name << endl;

int counter = 0;

// advance until it hits stars
while(cur != NULL && counter < 10){
if ((!xmlStrcmp(cur->name, (const xmlChar *)"parts")))
    break;

    cur->next;
    counter++;
}

out << "counter: " << counter << endl;
out << "child: " << cur->name << endl;

Это XML-файл, который я использую:

<?xml version="1.0" encoding="utf-8"?>
<netlist>
    <parts>
        <part name="part10">
            <attribute name="id">1</attribute>
        </part>
        <part name="part20">
            <attribute name="id">2</attribute>
        </part>
        <part name="part30">
            <attribute name="id">3</attribute>
        </part>
    </parts>

    <junk>
        <stuff id="3" />
        <stuff id="4" />
        <stuff id="5" />
    </junk>
</netlist>

Ответы [ 2 ]

5 голосов
/ 07 апреля 2017

Для libxml2 следующая система дочерних узлов для каждого узла по умолчанию является пустым документом. При использовании дерева dom для разбора документа xml, поскольку по умолчанию используется обработка пространства между узлами как первого дочернего узла, Вы можете вызвать функцию xmlKeepBlanksDefault (0), чтобы игнорировать пробел.

2 голосов
/ 13 августа 2010

Проблема в том, что вы не продвигаете текущий узел в цикле while. Попробуйте изменить cur->next; на cur = cur->next;. Вы видите первого дочернего элемента <netlist>, который является текстовым узлом, содержащим пробел перед элементом <parts>.

...