欢迎访问个人博客,阅读此文http://www.yandong.org/archives/343
安装:
xml2-config –cflags
//
取得预处理和编译标志
xml2-config –libs
//
取得链接标志
|
几个网址:
http://sblig.iteye.com/blog/814323
百度文库资料
使用:
解析文件:
void
parseDoc (
char
*docName )
{
xmlDocPtr doc;
//文件指针
xmlNodePtr cur;
//节点指针
doc = xmlParseFile(docName);
cur = xmlDocGetRootElement(doc);
if
(xmlStrcmp(cur->name, (
const
xmlChar*)
"root"
) )
{
xmlFreeDoc(doc);
return
;
}
cur = cur->xmlChildrenNode;
parseNode(doc, cur);
//处理节点
//xmlSaveFormatFileEnc("tconfig.xml", doc, "UTF-8", 1 );//保存修改
xmlFreeDoc(doc);
//释放内存
xmlCleanupParser();
xmlMemoryDump();
return
;
}
|
创建xml文件:
outputDoc = xmlNewDoc(BAD_CAST
"1.0"
);
outputCur = xmlNewNode( NULL, BAD_CAST
"root"
);
xmlDocSetRootElement(outputDoc, outputCur);
outputCur = xmlDocGetRootElement(outputDoc);
outputFileName =(
const
char
*) generateFileName(i).c_str();
xmlSaveFormatFileEnc(outputFileName, outputDoc,
"UTF-8"
, 1 );
xmlFreeDoc(outputDoc);
|
处理节点:
获取节点属性:
<xen_host id=”1″>
</xen_host>
xmlChar * attr;
attr = xmlGetProp(cur, (
const
xmlChar*)
"id"
);
cout<<cur->name<<
" id= "
<<attr<<
" "
<<endl;
xmlFree(attr);
|
寻找所有叫xen_host的节点:
<root>
<xen_host id=”1″>
</xen_host>
<xen_switch id=”1″>
</xen_switch>
<xen_host id=”1″>
</xen_host>
//此处空白叫 text,在cur = cur->next中也会出现
</root>
while
(cur != NULL)
{
if
(!xmlStrcmp(cur->name, (
const
xmlChar*)
"xen_host"
) )
{
//处理
}
cur = cur->next;
}
|
获取中间text内容:
<linknode >
获取这个
</linknode>
xmlChar * attr;
attr = xmlNodeListGetString(doc, linkNode->xmlChildrenNode, 1 );
xmlFree(attr);
|
拼接xmlChar和int或者char:
方式有很多,也可以使用stringstream,但是发现总是会有错误,合并出来的字符串出现乱码,估计是指针操作没有处理好。
char
buf[1024];
string genXenSubnetString ( xmlChar * attr )
{
sprintf
(buf,
"/root/xen_subnet/link/parent::*"
, attr);
return
string(buf);
}
|
删除节点:
xmlNodePtr
xmlDeleteNode (xmlNodePtr cur )
{
xmlNodePtr tempNode;
tempNode = cur->next;
cout<<
"del"
<<endl;
xmlUnlinkNode(cur);
xmlFreeNode(cur);
cur = tempNode;
return
cur;
}
|
复制节点:
temp1 = xmlCopyNode( cur, 1 );
xmlAddChild(outputCur, temp1);
|
xpath的使用:
要想自由的处理xml的节点,要么自己建立数据结构把所有的xml节点存起来,要么使用xpath,对xpath的使用难点在于匹配表达式的书写。
//该函数是接受xpath表达式,返回找到的xml节点数组对象
xmlXPathObjectPtr getNodeSet(xmlDocPtr doc,
const
xmlChar *xpath)
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if
(context == NULL)
{
printf
(
"context is NULL\n"
);
return
NULL;
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if
(result == NULL)
{
printf
(
"xmlXPathExpression return NULL\n"
);
return
NULL;
}
if
(xmlXPathNodeSetIsEmpty(result->nodesetval))
{
xmlXPathFreeObject(result);
printf
(
"nodeset is empty\n"
);
return
NULL;
}
return
result;
}
xmlChar *xpath;
xmlXPathObjectPtr xpathResult;
xmlNodeSetPtr nodeSet;
int
nodeSetSize;
xpath = (xmlChar *)
"/root/*[@id='54']"
;
xpathResult = getNodeSet(doc, xpath);
//处理xpath
if
(NULL != xpathResult)
{
nodeSet = xpathResult->nodesetval;
//转换类型
nodeSetSize = (nodeSet)?(nodeSet->nodeNr):0;
//判断个数
for
(
int
i=0; i<nodeSetSize; i++)
{
//处理
cout<<nodeSet->nodeTab[i]->name<<endl;
}
}
|
关于xpath怎么写,请看这篇文章
几个问题:
1.
因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h
#define BAD_CAST (xmlChar *)
(continue….)