我使用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>
答案 0 :(得分:5)
对于libxml2,默认情况下,每个节点的下一个子节点系统都是空白文档,当使用dom树解析xml文档时,由于默认方式是将节点之间的空间视为第一个子节点,你可以调用函数xmlKeepBlanksDefault(0)来忽略空格。
答案 1 :(得分:2)
问题是您没有推进while
循环中的当前节点。尝试将cur->next;
更改为cur = cur->next;
。您正在看到<netlist>
的第一个子节点,它是一个包含<parts>
元素之前的空格的文本节点。