TiXmlNode * FindChildNode(TiXmlNode * pNode,string strNodeName,string strNodeAttrName,string strNodeAttrValue)
{
// 定义一个TiXmlDocument类指针
TiXmlNode * pSelectNode = NULL;
TiXmlNode * pChildNode = NULL;
int t = pNode->Type();
switch(t)
{
case TiXmlText::TINYXML_DOCUMENT:
case TiXmlText::TINYXML_DECLARATION:
case TiXmlText::TINYXML_TEXT:
case TiXmlText::TINYXML_UNKNOWN:
case TiXmlText::TINYXML_COMMENT:
break;
case TiXmlText::TINYXML_ELEMENT:
if(pNode->Value() == strNodeName)
{
//cout << pNode->Value() << endl;
if(!strNodeAttrName.empty() && !strNodeAttrValue.empty())
{
TiXmlElement * pElement = pNode->ToElement();
TiXmlAttribute * pAttr = pElement->FirstAttribute();
TiXmlAttribute * pNextAttr =NULL;
if(pAttr != NULL)
{
do
{
if(pAttr->Name()==strNodeAttrName && pAttr->Value()== strNodeAttrValue)
{
cout << "Name: " << pAttr->Name();
cout << " value: " << pAttr->Value() << endl;
return pNode;
}
}while(pAttr = pAttr->Next());
}
}
else
{
return pNode;
}
}
default:
break;
}
//循环访问它的每一个元素,否则找到第一个就不找了
for(pChildNode=pNode->FirstChild();pChildNode!=0;pChildNode = pChildNode->NextSibling())
{
pSelectNode = FindChildNode(pChildNode,strNodeName,strNodeAttrName,strNodeAttrValue);
if (pSelectNode)
{
break;
}
}
return pSelectNode;
}
//cXmlName: xml文件名
//strNodeName: xml文件名
//strNodeAttrName1: xml文件名
//strNodeAttrValue1: xml文件名
//strNodeAttrName2: xml文件名
//根据xml中节点名、节点属性名及节点属性名对应的属性值唯一确定一节点
//返回值:获得的属性值,string 类型
TiXmlNode* GetOnlyOneNode(const char* cXmlName,string strNodeName,string strNodeAttrName,string strNodeAttrValue)
{
//const char * cXmlName = "coverage.xml";
//readXml(cXmlName);
// string strNodeName = "Folder";
// string strNodeAttrName = "Name";
// string strNodeAttrValue = "app1";
string tmpAttrValue = "";
TiXmlElement* RootElement = OpenXml(cXmlName);
TiXmlNode * pSelectNode = NULL;
TiXmlNode * pNode = NULL;
for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
{
pSelectNode = FindChildNode(pNode,strNodeName,strNodeAttrName,strNodeAttrValue);
if (pSelectNode)
{
break;
}
}
return pSelectNode;
}
//从唯一指定的节点中指定该节点中一属性名,获得该属性名对应的属性值
string GetNodeAttrValue(TiXmlNode* pSelectNode, string strNodeAttrName)
{
string strRtnNodeAttrValue = "";
//获得其属性
TiXmlElement * pElement = pSelectNode->ToElement();
TiXmlAttribute * pAttr = pElement->FirstAttribute();
TiXmlAttribute * pNextAttr =NULL;
if(pAttr != NULL)
{
string tmpAttrVal = "";
string tmpAttrName = "";
do
{
tmpAttrName = pAttr->Name();
if (pAttr->Name()==strNodeAttrName)
{
strRtnNodeAttrValue = pAttr->Value();
break;
}
}while(pAttr = pAttr->Next());
}
return strRtnNodeAttrValue;
}
int main(int argc,char* argv[])
{
const char * cXmlName = "coverage.xml";
string strNodeName = "Folder";
string strNodeAttrName = "Name";
string strNodeAttrValue = "app12";
string strNodeAttrName1 = "value";
TiXmlNode * pNode = GetOnlyOneNode(cXmlName,strNodeName,strNodeAttrName,strNodeAttrValue);
string strNodeAttrValue1 = GetNodeAttrValue(pNode,strNodeAttrName1);
cout << strNodeAttrValue1.c_str() << endl;
return 0;
}
发现现在网上现有用tinyxml 工具用c、c++写的xml解析工具用起来有点不方便,如是自己优化优化了一下:
所解析的xml文档如下:
<?xml version="1.0" encoding="utf-8" ?>
<covergae Name="ne500e" statement="80%">
<Folder Name="release" path="D:\Release">
<Folder Name="product" path="D:\Release\product">
<Folder Name="8090" path="D:\product\8090">
<Folder Name="app1" path="D:\Release\product\8090\app1"/>
<Folder Name="app2" path="D:\Release\product\8090\app2"/>
<Folder Name="app3" path="D:\Release\product\8090\app3"/>
<Folder Name="app4" path="D:\Release\product\8090\app4"/>
<Folder Name="app5" path="D:\Release\product\8090\app5"/>
<Folder Name="app6" path="D:\Release\product\8090\app6"/>
<Folder Name="app7" path="D:\Release\product\8090\app7"/>
<Folder Name="app8" path="D:\Release\product\8090\app8"/>
<Folder Name="app9" path="D:\Release\product\8090\app9"/>
<Folder Name="app10" path="D:\Release\product\8090\app10"/>
<Folder Name="app11" path="D:\Release\product\8090\app11"/>
<Folder Name="app12" path="D:\Release\product\8090\app12" value="1024"/>
</Folder>
</Folder>
</Folder>
</covergae>
最后输出:
Name: Name value: app12
1024
Press any key to continue