Tinyxml一一利用tinyxml写入节点元素属性值

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

考虑我们有如下Attr_Write.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>
 <Floor2>
  <Attr_1Floor>
   <Attr1 name="Attr1" x="5" y="15" w="400" h="25"/>
   <Attr2 name="Attr2" x="5" y="15" w="400" h="25"/>
  </Attr_1Floor>
 </Floor2>
</FileRoot>

首先,我们对相对简单的节点属性Attr1,Attr2进行写入操作:

/*
<FileRoot>
 <Attr1 ip="192.168.1.3" timeout="123.456000" />
 <Attr2 ip="192.168.0.1" timeout="5000" />
</FileRoot>
*/
bool CTinyxmlEngine::Write_XML_1Floor_Attr(const char*pszPath,const char*pszNode,const char*pszName,const char*pszValue)
{
 TiXmlDocument doc(pszPath); 
 if (!doc.LoadFile()) 
 {      
  return false;
 }
 const char*pszXmlName;
 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();
    if (strcmp(pszXmlName,pszName)==0)
    {
     p_attribute->SetValue(pszValue);
     doc.SaveFile();
     return true;
    }
   }      
  }
 }
 return false;
}

同理,接下来逐层嵌套,就可以实现更深层次的写入操作:如下是操作两层节点

/*
<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::Write_XML_2Floor_Attr(const char*pszPath,const char*pszNode,const char*pszNode1,const char*pszName,const char*pszValue)
{
 TiXmlDocument doc(pszPath);
 if (!doc.LoadFile())
 {
  return false;
 }
 const char*pszXmlName;
 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();
    if (strcmp(pszXmlName,pszNode1)==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();
      if (strcmp(pszXmlName,pszName)==0)
      {
       p_attribute->SetValue(pszValue);
       doc.SaveFile();
       return true;
      }
     }    
    }
   }
  }
 }
 return false;
}

操作三层节点的函数代码,如下所示:

/*
<FileRoot>
 <Floor2>
  <Attr_1Floor>
   <Attr1 name="Attr1" x="5" y="15" w="400" h="25" />
   <Attr2 name="Attr2" x="5" y="15" w="400" h="25" />
  </Attr_1Floor>
 </Floor2>
</FileRoot>
*/
bool CTinyxmlEngine::Write_XML_3Floor_Attr(const char*pszPath,const char*pszNode,const char*pszNode1,const char*pszNode2,const char*pszName,const char*pszValue)
{
 TiXmlDocument doc(pszPath);
 if (!doc.LoadFile())
 {
  return false;
 }
 const char*pszXmlName;
 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();
    if (strcmp(pszXmlName,pszNode1)==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();
      if (strcmp(pszXmlName,pszNode2)==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();
        if (strcmp(pszXmlName,pszName)==0)
        {
         p_attribute->SetValue(pszValue);
         doc.SaveFile();
         return true;
        }
       } 
      } 
     }
    }
   }
  }
 }
 return false;
}

最后,我们可以调用上述函数来实现对文件Attr_Write.xml的操作:

//  /************************************************************************/
//  /* Write_XML_Floor_Attr                                                 */
//  /************************************************************************/
int main()
{
 CTinyxmlEngine m_engine;
 m_engine.Write_XML_1Floor_Attr("Attr_Write.xml","Attr1","ip","192.168.1.3");
 m_engine.Write_XML_1Floor_Attr("Attr_Write.xml","Attr2","timeout","5000");

 m_engine.Write_XML_2Floor_Attr("Attr_Write.xml","Attr_1Floor","Attr1","name","jack");
 m_engine.Write_XML_2Floor_Attr("Attr_Write.xml","Attr_1Floor","Attr2","w","666");

 m_engine.Write_XML_3Floor_Attr("Attr_Write.xml","Floor2","Attr_1Floor","Attr1","name","apple");
 m_engine.Write_XML_3Floor_Attr("Attr_Write.xml","Floor2","Attr_1Floor","Attr2","y","888");
 return 0;
}

程序运行后,Attr_Write.xml文件内容更新,如下所示:

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

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

本版积分规则

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

下载期权论坛手机APP