使用libxml2在xml中删除空白

时间:2012-09-05 09:55:36

标签: c xml-parsing libxml2

我将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循环下添加以避免空白,但没有帮助。你能帮我解决这些空白的空白吗?感谢。

1 个答案:

答案 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才能产生任何效果。