考虑我们有如下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>