如何用Libxml2解析XML空节点?在C.

时间:2014-07-08 13:15:34

标签: c xml xpath libxml2

我在使用libxml2在C中获取空节点时遇到问题。问题是节点就像 <node />并且lib在xPath中识别它,但如果我尝试在其中放入更多节点,则lib不会执行此操作。

这里是我用于解析文档的代码:

xmlDocPtr xApiXmlUtilsGetDocFile(char *pcDocName)
{
    xmlDocPtr xDoc;
    xDoc = xmlReadFile(pcDocName,"utf-8",XML_PARSE_NOBLANKS);

    if (xDoc == NULL)
    {
        fprintf(stderr, "Document not parsed successfully. \n");
        return NULL;
    }
    TRACE("Document parsed successfully.");
    return xDoc;
}

这里添加节点的代码(如果节点类似于<node></node>则正确放置):

int lApiAddElement(xmlDocPtr xDoc, char* pcXPATHBrother, char* pcChildName, char* pcChildContent, AddType_t xAddType)
{
    xmlXPathObjectPtr xPathObj;

    /* Create xpath evaluation context */
    xPathObj = xApiXmlUtilsGetNodeSet(xDoc, BAD_CAST pcXPATHBrother);
    if( xPathObj == NULL )
    {
        return -1;
    }

    // Get the div node
    xmlNodeSetPtr xNodes = xPathObj->nodesetval;
    xmlNodePtr xDivNode = xNodes->nodeTab[0];

    xmlNodePtr xDivChildNode = xDivNode; //->xmlChildrenNode;
    if( (xAddType == eAddChildPrev) || (xAddType == eAddChildNext) )
    {
        xDivChildNode = xDivNode->xmlChildrenNode;
    }

    xmlNodePtr xHeadingNode = xmlNewNode(0, BAD_CAST pcChildName);
    xmlNodePtr xHeadingChildNode = xmlNewText(BAD_CAST pcChildContent);
    xmlAddChild(xHeadingNode, xHeadingChildNode);

    // Add the new element to the existing tree after the text content
    if( (xAddType == eAddPrev) || (xAddType == eAddChildPrev) )
    {
        xmlAddPrevSibling(xDivChildNode, xHeadingNode);
    }
    else
    {
        if( xAddType == eAddChildNext )
        {
            xmlAddSibling(xDivChildNode, xHeadingNode);
        }
        else
        {
            xmlAddNextSibling(xDivChildNode, xHeadingNode);
        }
    }

    //if you want to display the result
    xmlDocDump(stdout, xDoc);

    return 0;
}
OBS:我无法控制节点的生成,就像答案所暗示的那样。

How to convert <node/> to <node></node> with libxml (converting empty elements to start-end tag pairs)

那么,如何使用libxml2将节点添加到空节点?

修改

稍微调试我的功能我发现在我得到孩子的行中:

xDivChildNode = xDivNode->xmlChildrenNode;

如果节点是<node />那么chindremNode将为null,那么如何保证甚至不返回null?

感谢。

1 个答案:

答案 0 :(得分:1)

根据您的调试日志,您需要替换

xmlNodePtr xDivChildNode = xDivNode; //->xmlChildrenNode;
if( (xAddType == eAddChildPrev) || (xAddType == eAddChildNext) )
{
    if (xDivNode->xmlChildrenNode == NULL){
        xmlNodeAddContent(xDivNode,BAD_CAST " ");//avoiding empty nodes, puting content in the node.
    }
    xDivChildNode = xDivNode->xmlChildrenNode;
}

确保libxml不向xml文件添加空节点。