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

考虑我们有如下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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值