Tinyxml一一利用tinyxml读取节点元素属性值

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 15:55   11   0

有的xml文件中内容是按属性方式写入的,格式示例如下所示:

<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<FileRoot>
 <Attr1 ip="192.168.0.1" timeout="123.456000"/>
 <Attr2 ip="192.168.0.1" timeout="123.456000"/>
 <Attr_1Floor>
  <Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
  <Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
 </Attr_1Floor>
</FileRoot>

针对这种格式的xml文件我们可以利用TiXmlAttribute属性进行遍历查找存储,具体实现细节如下:

1、首先我们针对Attr1属性里面的内容,我们可以采用_STL_1MAP_PARAM来存储,如下所示:

/*
<FileRoot>
 <Attr1 ip="192.168.0.1" timeout="123.456000"/>
 <Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param)
{
 TiXmlDocument doc(pszPath);
 if (!doc.LoadFile())
 {
  return false;
 }
 const char*pszXmlName,*pszXmlValue;
 TiXmlElement* p_root = doc.RootElement();
 for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
 {
  pszXmlName=p_node->Value();
  if (strcmp(pszXmlName,pszNode)==0)
  {
   TiXmlElement*p_element = p_node->ToElement();
   for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
   {
    pszXmlName = p_attribute->Name();
    pszXmlValue = p_attribute->Value();
    if (NULL!=pszXmlValue)
    {
     m_param.v_param.push_back(pszXmlName);
     m_param.m_param.insert(map<string,string>::value_type(pszXmlName,pszXmlValue));
    }
   }
   break;
  }
 }
 return true;
}

同理,如果有多个类似Attr1的属性值存在的话,我们可以采用_STL_2MAP_PARAM参数进行存储,如下所示:

/*
<FileRoot>
 <Attr1 ip="192.168.0.1" timeout="123.456000"/>
 <Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,_STL_2MAP_PARAM&m_param)
{
 TiXmlDocument doc(pszPath);
 if (!doc.LoadFile())
 {
  return false;
 }
 const char*pszXmlName,*pszXmlValue,*pszXmlName1;
 _STL_1MAP_PARAM m_param1;
 TiXmlElement* p_root = doc.RootElement();
 for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
 {
  pszXmlName = p_node->Value();
  if (pszXmlName!=NULL)
  {
   TiXmlElement* p_element = p_node->ToElement();
   m_param1.m_param.clear();
   m_param1.v_param.clear();
   for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
   {
    pszXmlName1 = p_attribute->Name();
    pszXmlValue = p_attribute->Value();
    if (pszXmlValue!=NULL)
    {
     m_param1.v_param.push_back(pszXmlName1);
     m_param1.m_param.insert(make_pair(pszXmlName1,pszXmlValue));
    }
   }
   if (!m_param1.v_param.empty())
   {
    m_param.v_param.push_back(pszXmlName);
    m_param.m_param.insert(make_pair(pszXmlName,m_param1));
   }
  }
 }
 return true;
}

扩展:我们可以读取多个上述节点,根据需要的节点来获取属性值,比如我们需要获取Attr_1Floor属性值,如下所示:

/*
<FileRoot>
 <Attr_1Floor>
  <Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
  <Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
 </Attr_1Floor>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,_STL_2MAP_PARAM&m_param)
{
 TiXmlDocument doc(pszPath);
 if (!doc.LoadFile())
 {
  return false;
 }
 const char*pszXmlName,*pszXmlValue,*pszXmlName1;
 _STL_1MAP_PARAM m_param1;
 TiXmlElement* p_root = doc.RootElement();
 for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
 {
  pszXmlName = p_node->Value();
  if (strcmp(pszXmlName,pszNode)==0)
  {
   TiXmlElement*p_element = p_node->ToElement();
   for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
   {
    pszXmlName=p_node->Value();
    TiXmlElement*p_element = p_node->ToElement();
    m_param1.m_param.clear();
    m_param1.v_param.clear();
    for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
    {
     pszXmlName1 = p_attribute->Name();
     pszXmlValue = p_attribute->Value();
     if (NULL!=pszXmlValue)
     {
      m_param1.v_param.push_back(pszXmlName1);
      m_param1.m_param.insert(map<string,string>::value_type(pszXmlName1,pszXmlValue));
     }
    }
    m_param.v_param.push_back(pszXmlName);
    m_param.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName,m_param1));
   }
   break;
  }
 }
 return true;
}

函数示例调用如下:

#include <iostream>
#include <string>
#include "TinyxmlEngine.h"
using namespace std;

void Print_m_param1(_STL_1MAP_PARAM m_param1)
{
 vector<string>::iterator it = m_param1.v_param.begin();
 for (;it!=m_param1.v_param.end();++it)
 {
  cout<<"   "<<*it<<": "<<m_param1.m_param[*it]<<endl;
 }
 cout<<"================================"<<endl;
}

void Print_m_param2(_STL_2MAP_PARAM m_param2)
{
 vector<string>::iterator it = m_param2.v_param.begin();
 for (;it!=m_param2.v_param.end();++it)
 {
  cout<<*it<<":"<<endl;
  _STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];
  vector<string>::iterator it1 = m_param1.v_param.begin();
  for (;it1!=m_param1.v_param.end();++it1)
  {
   cout<<"   "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;
  }
  cout<<"================================"<<endl;
 }
}

void Print_m_param3(_STL_3MAP_PARAM m_param3)
{
 vector<string>::iterator it = m_param3.v_param.begin();
 for (;it!=m_param3.v_param.end();++it)
 {
  cout<<*it<<":"<<endl;
  _STL_2MAP_PARAM m_param2;
  m_param2 = m_param3.m_param[*it];
  vector<string>::iterator it = m_param2.v_param.begin();
  for (;it!=m_param2.v_param.end();++it)
  {
   cout<<"   "<<*it<<":"<<endl;
   _STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];
   vector<string>::iterator it1 = m_param1.v_param.begin();
   for (;it1!=m_param1.v_param.end();++it1)
   {
    cout<<"      "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;
   }
  }
  cout<<"================================"<<endl;
 }
}

int main()
{
 CTinyxmlEngine m_engine;
 _STL_1MAP_PARAM  m_param1;
 m_engine.Read_XML_1Floor_Attr("Attr.xml","Attr1",m_param1);
 Print_m_param1(m_param1);
 
 _STL_2MAP_PARAM  m_param2;
 m_engine.Read_XML_2Floor_Attr("Attr.xml",m_param2);
 Print_m_param2(m_param2);

 m_engine.Erase_Param_2AMP(m_param2);
 m_engine.Read_XML_2Floor_Attr("Attr.xml","Attr_1Floor",m_param2);
 Print_m_param2(m_param2);

 return 0;
}

运行结果:

至此,根据Tinyxml读取xml的text内容及attribute属性操作都描述完成了,在实际的应用过程中,两种文本写入方式往往会结合使用,这就需要我们根据不同的场景需求进行相应的遍历读取,接下来讲讲文本及属性的xml写入

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP