我将xml文件作为:
<Config>
<tlvid id="2">
<type>10</type>
<Devid>001b00100000</Devid>
</tlvid>
<tlvid id="3">
<sessionid>abcd123</sessionid>
</tlvid>
解析xml文件的代码是:
xmlNode *cur_node = NULL,*sub_node = NULL;
xmlChar *key;
cur_node = a_node->xmlChildrenNode;
while(cur_node !=NULL) {
if((!xmlStrcmp(cur_node->name,(const xmlChar*)"tlvid"))) {
key = xmlGetProp(cur_node,(const xmlChar*)"id");
printf("key: %s\n ",key);
xmlFree(key);
sub_node = cur_node->xmlChildrenNode;
while(sub_node !=NULL) {
key = xmlNodeGetContent(sub_node);
printf("subkey: %s\n ",key);
xmlFree(key);
sub_node = sub_node->next;
}
}
cur_node = cur_node->next;
}
输出为:
键:2
子项:
子键:10
子项:
子键:001b00100000
子项:
键:3
子项:
子键:abcd123
子项:
我试过xmlKeepBlanksDefault(0);在while循环下添加以避免空白,但没有帮助。你能帮我解决这些空白的空白吗?感谢。
答案 0 :(得分:1)
通过选中xmlNodeIsText
:
cur_node
的文字儿童
for(sub_node = cur_node->xmlChildrenNode;
sub_node != NULL;
sub_node = sub_node->next)
{
if(xmlNodeIsText(sub_node)) continue;
…
}
作为跳过所有文本节点的替代方法,您可以确保只使用xmlIsBlankNode
跳过空白节点:
for(sub_node = cur_node->xmlChildrenNode;
sub_node != NULL;
sub_node = sub_node->next)
{
if(xmlIsBlankNode(sub_node)) continue;
…
}
如果<tlvid>
元素中直接存在非空白文本,则两个结果会有所不同。
阅读the manual for xmlKeepBlanksDefault
以找出使解析器忽略这些空白节点所需的条件。显然,你需要一个验证解析器和一个合适的DTD才能产生任何效果。