xmlNodeGetContent()可以返回NULL吗?

时间:2018-02-21 08:19:29

标签: c xml libxml2

libxml2具有函数xmlNodeGetContent(),在http://xmlsoft.org/html/libxml-tree.html#xmlNodeGetContent中记录如下:

xmlChar *xmlNodeGetContent  (const xmlNode * cur)
  

读取节点的值,这可以是该节点直接携带的文本,如果它是一个TEXT节点,或者是该节点子节点携带的值的聚合字符串(TEXT和ENTITY_REF) 。实体引用被替换。

     

cur:正在读取的节点   返回:新的#xmlChar *或如果没有可用内容则为NULL。它由调用者使用xmlFree()来释放内存。

如果cur是一个空节点,例如<foo/>(或等效的<foo></foo>),那么xmlNodeGetContent()将返回一个空字符串,而不是NULL,那是很好的IMO。

但是,在这种情况下,xmlNodeGetContent()会返回NULL吗?什么是简单的XML示例会发生什么?

1 个答案:

答案 0 :(得分:2)

如果传递给xmlNodeGetContent的节点为NULL,则返回值为NULL:

xmlNode *current_node = NULL;
xmlChar *ret_val;

ret_val = xmlNodeGetContent(current_node);

if(ret_val == NULL)
    printf("ret_val is NULL\n");

如果节点是Valid xmlNode,函数可能在不同情况下返回NULL,你可以在tree.c中检查函数:

xmlChar *xmlNodeGetContent(const xmlNode *cur)
{
if(cur == NULL)
    return (NULL);
switch(cur->type)
    {
    case XML_DOCUMENT_FRAG_NODE:
    case XML_ELEMENT_NODE:
        {
        xmlBufPtr buf;
        xmlChar *ret;

        buf = xmlBufCreateSize(64);
        if(buf == NULL)
            return (NULL);
        xmlBufGetNodeContent(buf, cur);
        ret = xmlBufDetach(buf);
        xmlBufFree(buf);
        return (ret);
        }
    case XML_ATTRIBUTE_NODE:
        return (xmlGetPropNodeValueInternal((xmlAttrPtr)cur));
    case XML_COMMENT_NODE:
    case XML_PI_NODE:
        if(cur->content != NULL)
            return (xmlStrdup(cur->content));
        return (NULL);
    case XML_ENTITY_REF_NODE:
        {
        xmlEntityPtr ent;
        xmlBufPtr buf;
        xmlChar *ret;

        /* lookup entity declaration */
        ent = xmlGetDocEntity(cur->doc, cur->name);
        if(ent == NULL)
            return (NULL);

        buf = xmlBufCreate();
        if(buf == NULL)
            return (NULL);

        xmlBufGetNodeContent(buf, cur);

        ret = xmlBufDetach(buf);
        xmlBufFree(buf);
        return (ret);
        }
    case XML_ENTITY_NODE:
    case XML_DOCUMENT_TYPE_NODE:
    case XML_NOTATION_NODE:
    case XML_DTD_NODE:
    case XML_XINCLUDE_START:
    case XML_XINCLUDE_END:
        return (NULL);
    case XML_DOCUMENT_NODE:
    #ifdef LIBXML_DOCB_ENABLED
    case XML_DOCB_DOCUMENT_NODE:
    #endif
    case XML_HTML_DOCUMENT_NODE:
        {
        xmlBufPtr buf;
        xmlChar *ret;

        buf = xmlBufCreate();
        if(buf == NULL)
            return (NULL);

        xmlBufGetNodeContent(buf, (xmlNodePtr)cur);

        ret = xmlBufDetach(buf);
        xmlBufFree(buf);
        return (ret);
        }
    case XML_NAMESPACE_DECL:
        {
        xmlChar *tmp;

        tmp = xmlStrdup(((xmlNsPtr)cur)->href);
        return (tmp);
        }
    case XML_ELEMENT_DECL:
        /* TODO !!! */
        return (NULL);
    case XML_ATTRIBUTE_DECL:
        /* TODO !!! */
        return (NULL);
    case XML_ENTITY_DECL:
        /* TODO !!! */
        return (NULL);
    case XML_CDATA_SECTION_NODE:
    case XML_TEXT_NODE:
        if(cur->content != NULL)
            return (xmlStrdup(cur->content));
        return (NULL);
    }
return (NULL);
}