我在使用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:我无法控制节点的生成,就像答案所暗示的那样。
那么,如何使用libxml2将节点添加到空节点?
修改
稍微调试我的功能我发现在我得到孩子的行中:
xDivChildNode = xDivNode->xmlChildrenNode;
如果节点是<node />
那么chindremNode将为null,那么如何保证甚至不返回null?
感谢。
答案 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文件添加空节点。