为什么libxml2在元素名称上输出“text”(当它不是“text”时)?

时间:2010-08-12 21:13:24

标签: c++ libxml2

我使用libxml2进行XML解析。 libxml网站上的示例代码很难遵循,似乎缺少一些细节。我通过Googling得到了以下代码,所以我甚至认为这不是正确的方法,但它在我编写的示例学习程序中有效,但不是这个。我仍然不知道在C ++中使用libxml的正确方法,所以我在黑暗中运行并希望我能找到有用的东西。

正确加载XML文件,当此函数正确输出root->name时,但当它通过子项时,它只会在text输出cur->name,我不知道为什么。我必须把计数器放在那里以阻止它进入无限循环。我读到XML文件中的某个空格可能会导致这种情况,但我不知道该怎么做。我只想要零件名称和ID。

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 个答案:

答案 0 :(得分:5)

对于libxml2,默认情况下,每个节点的下一个子节点系统都是空白文档,当使用dom树解析xml文档时,由于默认方式是将节点之间的空间视为第一个子节点,你可以调用函数xmlKeepBlanksDefault(0)来忽略空格。

答案 1 :(得分:2)

问题是您没有推进while循环中的当前节点。尝试将cur->next;更改为cur = cur->next;。您正在看到<netlist>的第一个子节点,它是一个包含<parts>元素之前的空格的文本节点。