c++中如何遍历XML
- 格式:doc
- 大小:18.50 KB
- 文档页数:3
一、概述在软件开发中,XML(可扩展标记语言)被广泛应用于数据交换和存储。
而C++作为一种功能强大的编程语言,自然也能够很好地处理XML文件。
本文将通过一个实例来详细介绍C++如何读取和处理XML文件。
二、准备工作在学习C++读取处理XML文件之前,我们需要确保已经安装了相应的开发环境。
XML文件的处理通常需要借助第三方库,比如TinyXML 或者RapidXML。
我们可以选择其中一款库来进行XML文件的读取和处理。
三、示例代码以下是一个简单的C++示例代码,演示了如何使用TinyXML库来读取和处理XML文件。
```cpp#include <iostream>#include "tinyxml2.h"int m本人n() {tinyxml2::XMLDocument doc;doc.LoadFile("example.xml");tinyxml2::XMLElement* root = doc.FirstChildElement("Root"); if (root) {for (tinyxml2::XMLElement* element = root->FirstChildElement(); element; element = element->NextSiblingElement()) {std::cout << "Element Name: " << element->Name() << std::endl;std::cout << "Element Value: " << element->GetText() << std::endl;}}return 0;}```四、解析代码说明在上面的示例代码中,我们首先包含了头文件"tinyxml2.h",然后创建了一个XMLDocument对象,并且使用LoadFile()方法加载了一个名为"example.xml"的XML文件。
说明:您只要在此处评价就会获得一分再下载文档将会相互抵消所以你将不会损失一切哦正文:用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。
已知有一个XML文件(bookstore.xml)如下:1、往<bookstore>节点中插入一个<book>节点://================结果为:2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
//=================最后结果为:3、删除<book genre="fantasy" ISBN="2-3631-4">节点的genre属性,删除<book genre="update李赞红" ISBN="2-3631-4">节点。
if(xe.GetAttribute("genre")=="fantasy"){xe.RemoveAttribute("genre");//删除genre属性}else if(xe.GetAttribute("genre")=="update李赞红") {xe.RemoveAll();//删除该节点的全部内容}}xmlDoc.Save("bookstore.xml");//====================最后结果为:4、显示所有数据。
转载自:/s98/archive/2004/10/17/140307.aspxXmlDocument xmlDoc=new XmlDocument();xmlDoc.Load("c:/aaa.xml");XmlNode xn=xmlDoc.SelectSingleNode("todate");XmlNodeList xnl=xn.ChildNodes;foreach(XmlNode xnf in xnl){XmlElement xe=(XmlElement)xnf;XmlNodeList xnf1=xe.ChildNodes;Response.Write(xnf1[0].InnerText);//显示子节点点文本}XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load("c:/aaa.xml");XmlNode xn=xmlDoc.SelectSingleNode("todate");XmlNodeList xnl=xn.ChildNodes;foreach(XmlNode xnf in xnl){XmlElement xe=(XmlElement)xnf;XmlNodeList xnf1=xe.ChildNodes;xnf1[0].InnerText="10";xmlDoc.Save("c:/aaa.xml");。
《C++中针对XML操作的相关函数》在C++编程中,XML作为一种常见的数据交换格式,经常被用于数据存储和传输。
针对XML的操作,C++提供了一些相关的函数和库,方便开发人员进行XML数据的读取、解析和生成。
本文将对C++中针对XML操作的相关函数进行全面评估,并探讨其深度和广度,以便读者更深入地理解XML操作的实现方法。
一、XML的基本概念在开始介绍C++中针对XML操作的相关函数之前,我们先来了解一下XML的基本概念。
XML即可扩展标记语言(eXtensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言。
XML被广泛应用于网页、数据交换、配置文件等领域,具有良好的可读性和扩展性。
二、C++中的XML操作库C++中广泛应用的XML操作库包括TinyXML、RapidXML、PugiXML等。
这些库提供了丰富的函数和类,用于读取、解析和生成XML数据。
接下来我们将重点介绍这些库中的相关函数,以及它们在XML操作中的应用。
1. TinyXMLTinyXML是一个轻量级的C++ XML解析库,提供了简单而强大的API用于读取和修改XML文档。
在TinyXML中,常用的函数包括LoadFile()、FirstChildElement()、NextSiblingElement()等,它们可以帮助开发人员快速定位XML文档中的节点并进行相关操作。
2. RapidXMLRapidXML是另一个轻量级的XML解析库,以其高效的解析速度和低内存占用而闻名。
在RapidXML中,常用的函数包括parse()、first_node()、next_sibling()等,它们能够帮助开发人员高效地解析XML文档并获取所需的数据。
3. PugiXMLPugiXML是一款易于使用的C++ XML解析库,具有高效的内部存储结构和快速的解析速度。
在PugiXML中,常用的函数包括load_file()、child()、next_sibling()等,它们可以帮助开发人员快速地加载XML文档并进行数据的访问和操作。
c#操作xml帮助类分享(xml增删改查)复制代码代码如下:using System;using System.Collections;using System.Xml;namespace .XmlDAL{public class XmlHelper{#region 公共变量XmlDocument xmldoc;XmlNode xmlnode;XmlElement xmlelem;#endregion#region 创建Xml⽂档/// <summary>/// 创建⼀个带有根节点的Xml⽂件/// </summary>/// <param name="FileName">Xml⽂件名称</param>/// <param name="rootName">根节点名称</param>/// <param name="Encode">编码⽅式:gb2312,UTF-8等常见的</param>/// <param name="DirPath">保存的⽬录路径</param>/// <returns></returns>public bool CreateXmlDocument(string FileName, string RootName, string Encode){try{xmldoc = new XmlDocument();XmlDeclaration xmldecl;xmldecl = xmldoc.CreateXmlDeclaration("1.0", Encode,null);xmldoc.AppendChild(xmldecl);xmlelem = xmldoc.CreateElement("", RootName, "");xmldoc.AppendChild(xmlelem);xmldoc.Save(FileName);return true;}catch (Exception e){return false;throw new Exception(e.Message);}}#endregion#region 常⽤操作⽅法(增删改)/// <summary>/// 插⼊⼀个节点和它的若⼲⼦节点/// </summary>/// <param name="XmlFile">Xml⽂件路径</param>/// <param name="NewNodeName">插⼊的节点名称</param>/// <param name="HasAttributes">此节点是否具有属性,True为有,False为⽆</param>/// <param name="fatherNode">此插⼊节点的⽗节点,要匹配的XPath表达式(例如:"//节点名//⼦节点名)</param>/// <param name="htAtt">此节点的属性,Key为属性名,Value为属性值</param>/// <param name="htSubNode">⼦节点的属性,Key为Name,Value为InnerText</param>/// <returns>返回真为更新成功,否则失败</returns>public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode){xmldoc = new XmlDocument();xmldoc.Load(XmlFile);XmlNode root = xmldoc.SelectSingleNode(fatherNode);xmlelem = xmldoc.CreateElement(NewNodeName);if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性{SetAttributes(xmlelem, htAtt);SetNodes(, xmldoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的⼦节点和它们的InnerText }else{SetNodes(, xmldoc, xmlelem, htSubNode);//若此节点⽆属性,那么直接添加它的⼦节点}root.AppendChild(xmlelem);xmldoc.Save(XmlFile);return true;}catch (Exception e){throw new Exception(e.Message);}}/// <summary>/// 更新节点/// </summary>/// <param name="XmlFile">Xml⽂件路径</param>/// <param name="fatherNode">需要更新节点的上级节点,要匹配的XPath表达式(例如:"//节点名//⼦节点名)</param>/// <param name="htAtt">需要更新的属性表,Key代表需要更新的属性,Value代表更新后的值</param>/// <param name="htSubNode">需要更新的⼦节点的属性表,Key代表需要更新的⼦节点名字Name,Value代表更新后的值InnerText</param>/// <returns>返回真为更新成功,否则失败</returns>public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode){try{xmldoc = new XmlDocument();xmldoc.Load(XmlFile);XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes;UpdateNodes(root, htAtt, htSubNode);xmldoc.Save(XmlFile);return true;}catch (Exception e){throw new Exception(e.Message);}}/// <summary>/// 删除指定节点下的⼦节点/// </summary>/// <param name="XmlFile">Xml⽂件路径</param>/// <param name="fatherNode">制定节点,要匹配的XPath表达式(例如:"//节点名//⼦节点名)</param>/// <returns>返回真为更新成功,否则失败</returns>public bool DeleteNodes(string XmlFile, string fatherNode){xmldoc = new XmlDocument();xmldoc.Load(XmlFile);xmlnode = xmldoc.SelectSingleNode(fatherNode);xmlnode.RemoveAll();xmldoc.Save(XmlFile);return true;}catch (XmlException xe){throw new XmlException(xe.Message);}}/// <summary>/// 删除匹配XPath表达式的第⼀个节点(节点中的⼦元素同时会被删除)/// </summary>/// <param name="xmlFileName">XML⽂档完全⽂件名(包含物理路径)</param>/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//⼦节点名</param>/// <returns>成功返回true,失败返回false</returns>public bool DeleteXmlNodeByXPath(string xmlFileName, string xpath){bool isSuccess = false;xmldoc = new XmlDocument();try{xmldoc.Load(xmlFileName); //加载XML⽂档XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);if (xmlNode != null){//删除节点xmldoc.ParentNode.RemoveChild(xmlNode);}xmldoc.Save(xmlFileName); //保存到XML⽂档isSuccess = true;}catch (Exception ex){throw ex; //这⾥可以定义你⾃⼰的异常处理}return isSuccess;}/// <summary>/// 删除匹配XPath表达式的第⼀个节点中的匹配参数xmlAttributeName的属性/// </summary>/// <param name="xmlFileName">XML⽂档完全⽂件名(包含物理路径)</param>/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//⼦节点名</param>/// <param name="xmlAttributeName">要删除的xmlAttributeName的属性名称</param>/// <returns>成功返回true,失败返回false</returns>public bool DeleteXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName) {bool isSuccess = false;bool isExistsAttribute = false;xmldoc = new XmlDocument();try{xmldoc.Load(xmlFileName); //加载XML⽂档XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);XmlAttribute xmlAttribute = null;if (xmlNode != null)//遍历xpath节点中的所有属性foreach (XmlAttribute attribute in xmlNode.Attributes){if (.ToLower() == xmlAttributeName.ToLower()){//节点中存在此属性xmlAttribute = attribute;isExistsAttribute = true;break;}}if (isExistsAttribute){//删除节点中的属性xmlNode.Attributes.Remove(xmlAttribute);}}xmldoc.Save(xmlFileName); //保存到XML⽂档isSuccess = true;}catch (Exception ex){throw ex; //这⾥可以定义你⾃⼰的异常处理}return isSuccess;}/*柯乐义*//// <summary>/// 删除匹配XPath表达式的第⼀个节点中的所有属性/// </summary>/// <param name="xmlFileName">XML⽂档完全⽂件名(包含物理路径)</param>/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//⼦节点名</param> /// <returns>成功返回true,失败返回false</returns>public bool DeleteAllXmlAttributeByXPath(string xmlFileName, string xpath){bool isSuccess = false;xmldoc = new XmlDocument();try{xmldoc.Load(xmlFileName); //加载XML⽂档XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);if (xmlNode != null){//遍历xpath节点中的所有属性xmlNode.Attributes.RemoveAll();}xmldoc.Save(xmlFileName); //保存到XML⽂档isSuccess = true;}catch (Exception ex){throw ex; //这⾥可以定义你⾃⼰的异常处理}return isSuccess;}#endregion#region 私有⽅法/// <summary>/// 设置节点属性/// </summary>/// <param name="xe">节点所处的Element</param>/// <param name="htAttribute">节点属性,Key代表属性名称,Value代表属性值</param>private void SetAttributes(XmlElement xe, Hashtable htAttribute){foreach (DictionaryEntry de in htAttribute){xe.SetAttribute(de.Key.ToString(), de.Value.ToString());}}/// <summary>/// 增加⼦节点到根节点下/// </summary>/// <param name="rootNode">上级节点名称</param>/// <param name="XmlDoc">Xml⽂档</param>/// <param name="rootXe">⽗根节点所属的Element</param>/// <param name="SubNodes">⼦节点属性,Key为Name值,Value为InnerText值</param>private void SetNodes(string rootNode, XmlDocument XmlDoc, XmlElement rootXe, Hashtable SubNodes) {if (SubNodes == null)return;foreach (DictionaryEntry de in SubNodes){xmlnode = XmlDoc.SelectSingleNode(rootNode);XmlElement subNode = XmlDoc.CreateElement(de.Key.ToString());subNode.InnerText = de.Value.ToString();rootXe.AppendChild(subNode);}}/// <summary>/// 更新节点属性和⼦节点InnerText值。
C++⽣成和解析XML⽂件的讲解概述1.xml 指可扩展标记语⾔(EXtensible Markup Language)2.xml 是⼀种标记语⾔,类似html3.xml 的设计宗旨是传输数据,⽽⾮显⽰数据4.xml 标签没有被预定义。
需要⾃⾏定义标签XML与HTML区别1.xml 不是 html 的替代。
2.xml 和 html 为不同的⽬的⽽设计:3.xml 被设计为传输和存储数据,其焦点是数据的内容。
4.html 被设计⽤来显⽰数据,其焦点是数据的外观。
5.html 旨在显⽰信息,⽽ xml 旨在传输信息。
第三⽅库XML第三⽅解析库,选⽤TinyXML,TinyXML也是⼀个开源的解析XML解析库,使⽤简单正如其名,⽤于C++开发,⽀持Windows和Linux。
TinyXML通过DOM模型遍历和分析XML。
⽣成XML⽂件TiXmlDocument xmlDocument;// 添加XML声明xmlDocument.LinkEndChild(new TiXmlDeclaration( "1.0", "GBK", "" ));// 添加根元素TiXmlElement * xmlRoot = new TiXmlElement("root");xmlDocument.LinkEndChild(xmlRoot);//根元素下添加⼦元素1TiXmlElement* xmlChild1 = new TiXmlElement("name");xmlRoot->LinkEndChild(xmlChild1);xmlChild1->LinkEndChild(new TiXmlText("woniu"));xmlChild1->SetAttribute("id", "0001");//设置属性//根元素下添加⼦元素2TiXmlElement* xmlChild2 = new TiXmlElement("Student");xmlRoot->LinkEndChild(xmlChild2);TiXmlElement* xmlChild2_01 = new TiXmlElement("name");xmlChild2->LinkEndChild(xmlChild2_01);xmlChild2_01->LinkEndChild(new TiXmlText("woniu201"));TiXmlElement* xmlChild2_02 = new TiXmlElement("classes");xmlChild2->LinkEndChild(xmlChild2_02);xmlChild2_02->LinkEndChild(new TiXmlText("86"));//保存xml⽂件xmlDocument.SaveFile("woniu.xml");⽣成XML如下:解析XML⽂件TiXmlDocument xmlDocument;if (!xmlDocument.LoadFile("woniu.xml")){return -1;}//根节点TiXmlElement* xmlRoot = xmlDocument.RootElement();if (xmlRoot == NULL){return -1;}//获取⼦节点信息1TiXmlElement* xmlNode1Name = xmlRoot->FirstChildElement("name");const char* node1Name = xmlNode1Name->GetText();const char* node1AttId = xmlNode1Name->Attribute("id");//获取⼦节点信息2TiXmlElement* xmlNode2Stu = xmlRoot->FirstChildElement("Student");TiXmlElement* xmlNode2_name = xmlNode2Stu->FirstChildElement("name");TiXmlElement* xmlname2_classes = xmlNode2Stu->FirstChildElement("classes");const char* node2Name = xmlNode2_name->GetText();const char* node2Classes = xmlname2_classes->GetText();总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
c语言解析xml源码
C语言解析XML源码是一个相当复杂的任务,因为XML是一种
具有层次结构的标记语言,它需要逐级解析并处理标签、属性和文
本内容。
在C语言中,通常会使用第三方库来解析XML,比较常用
的有libxml2和expat等。
首先,我们需要使用适当的方法读取XML文件的内容,可以使
用C语言的文件操作函数来实现。
然后,我们需要逐个读取XML文
件中的标签、属性和文本内容,这就需要用到字符串处理函数和逻
辑判断。
接着,我们需要建立数据结构来存储XML文件的层次结构,通常会使用树形结构来表示XML的层次关系。
在这个过程中,我们
需要考虑如何处理XML文件中的命名空间、实体引用等特殊情况。
一般来说,使用libxml2或expat等库可以大大简化解析XML
的过程。
这些库提供了丰富的API来处理XML文件,包括读取、解析、遍历和修改XML文档等功能。
使用这些库,我们可以更方便地
实现XML文件的解析和处理,而不需要从零开始编写解析XML的代码。
在实际编写C语言解析XML的源码时,需要考虑到错误处理、
内存管理、性能优化等方面。
特别是在处理大型XML文件时,需要考虑到内存占用和解析效率的问题。
因此,在编写解析XML的源码时,需要仔细考虑各种情况,并进行充分的测试和优化。
总之,解析XML的源码编写是一个复杂而且需要细致处理的任务,需要充分理解XML的结构和规范,同时使用合适的工具和技术来简化解析过程。
希望这个回答能够帮助你更好地理解C语言解析XML源码的过程。
C中的XML配置文件编程经验...C++中并没有操作XML文件的标准库,因此大家需要使用各自熟悉的XML库来解决XML文件的读取与写入。
XML的一个重要用途是作为程序的配置文件,存储程序运行相关的各种数据。
本文总结了使用libxml2库来对XML配置文件进行编程的一些经验。
最后提供了一个封装好的类CXMLConfig,并详细说明了该类的功能、使用方法和注意事项。
阅读本文所需的技术背景:l C/C++简单语法;l XML技术,XPATH技术;l C++编译器知识;本文的内容包括:l 下载与安装LIBXML2和ICONV;l 第一个例子程序的编写、编译链接和运行;l 使用XPATH读出多个配置项的值;l XML的配置文件类CXMLConfig;l 将配置项写入XML文件;l CXMLConfig类使用小结;阅读本文之前最好先读我的上一篇博客C++的XML编程经验――LIBXML2库使用指南,那一篇专门介绍libxml2库的使用方法。
本文将不会再详细介绍libxml2的使用,而是集中精力介绍如何存取XML中的数据。
本文的源代码是一个VC6的工程,里面包含三个子工程。
地址在。
1.下载与安装LIBXML2和ICONV为了方便读者,这一段原文照抄上一篇博客。
Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT 转换等功能。
Libxml2的下载地址是,完全版的库是开源的,并且带有例子程序和说明文档。
最好将这个库先下载下来,因为这样可以查看其中的文档和例子。
windows版本的的下载地址是;这个版本只提供了头文件、库文件和dll,不包含源代码、例子程序和文档。
在文本中,只需要下载libxml2库、iconv库和zlib库就行了(注意,libxml2库依赖iconv 和zlib库,本文中重点关注libxml2和iconv,zlib不介绍),我使用的版本是libxml2-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。
c++读取处理xml文件的实例C++ 作为一种强大的编程语言,可以用来读取和处理 XML 文件。
XML(可扩展标记语言)是一种常见的文本格式,用于存储和传输数据。
在 C++ 中,你可以使用许多库和工具来读取和处理 XML 文件,其中包括 Xerces-C++、TinyXML、RapidXML 等。
下面我将以使用RapidXML 库为例,展示一个简单的 C++ 代码来读取和处理 XML 文件。
首先,你需要在你的 C++ 项目中包含 RapidXML 库的头文件,并链接相应的库文件。
接下来,你可以使用 RapidXML 的 API 来打开 XML 文件、解析其中的内容并对其进行操作。
下面是一个简单的示例代码:cpp.#include <iostream>。
#include <fstream>。
#include "rapidxml.hpp"int main() {。
// 读取 XML 文件。
std::ifstream file("example.xml");std::stringxml_content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());// 解析 XML 内容。
rapidxml::xml_document<> doc;doc.parse<0>(&xml_content[0]);// 获取根节点。
rapidxml::xml_node<> root_node = doc.first_node();// 遍历子节点并处理数据。
for (rapidxml::xml_node<> node = root_node->first_node("item"); node; node = node->next_sibling("item")) {。
怎样在C#里对xml文件进行修改,新增,删除,插入操作?已知有一个XML文件(bookstore.xml)如下:<?xml vers ion="1.0" encoding="gb2312"?><bookstore><book genre="fantasy" ISBN="2-3631-4"><title>Oberon's Legacy</title><author>Corets, Eva</author><price>5.95</price></book></bookstore>1、往<bookstore>节点中插入一个<book>节点:XmlDocument xmlDoc=new XmlDocument();xmlDoc.Load("bookstore.xml");XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore> XmlElement xe1=xmlDoc.CreateElement("book");//创建一个<book>节点xe1.SetAttribute("genre","李赞红");//设置该节点genre属性xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性XmlElement xesub1=xmlDoc.CreateElement("title");xesub1.InnerText="CS从入门到精通";//设置文本节点xe1.AppendChild(xesub1);//添加到<book>节点中XmlElement xesub2=xmlDoc.CreateElement("author");xesub2.InnerText="候捷";xe1.AppendChild(xesub2);XmlElement xesub3=xmlDoc.CreateElement("price");xesub3.InnerText="58.3";xe1.AppendChild(xesub3);root.AppendChild(xe1);//添加到<bookstore>节点中xmlDoc.Save("bookstore.xml");//================结果为:<?xml vers ion="1.0" encoding="gb2312"?><bookstore><book genre="fantasy" ISBN="2-3631-4"><title>Oberon's Legacy</title><author>Corets, Eva</author><price>5.95</price></book><book genre="李赞红" ISBN="2-3631-4"><title>CS从入门到精通</title><author>候捷</author><price>58.3</price></book></bookstore>2、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点<author>的文本修改为“亚胜”。
我们建立一个xml文件,内容如图所示:
一,建立一个基于对话框的程序,工程名为xml;
二, 初始化OLE.
BOOL CXmlApp::InitInstance()
{
AfxOleInit();
…….
}
三, 在对话框中增加一个按钮,ID为IDC_CREATE,我们在这个按钮的响应函数中生成一
个xml文件.
void CXmlDlg::OnCreate()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot ;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
MessageBox( "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运
行库! ");
}
//根节点的名称为china
pDoc-> raw_createElement((_bstr_t)(char*) "china ", &xmlRoot);
pDoc-> raw_appendChild(xmlRoot, NULL);
MSXML2::IXMLDOMElementPtr childNode ;
pDoc-> raw_createElement((_bstr_t)(char*) "City ", &childNode);
childNode-> Puttext( "WuHan ");//节点值
childNode-> setAttribute( "population ", "8,000,000 ");//属性名,属性值
childNode-> setAttribute( "area ", "10000 ");
xmlRoot-> appendChild(childNode);
pDoc-> raw_createElement((_bstr_t)(char*) "City ", &childNode);
childNode-> Puttext( "ShangHai ");
childNode-> setAttribute( "population ", "12,000,000 ");
childNode-> setAttribute( "area ", "12000 ");
xmlRoot-> appendChild(childNode);
//保存到文件
//如果不存在就建立,存在就覆盖
pDoc-> save( "f:\\he.xml ");
}
不要忘了#import "msxml4.dll " //引入类型库
四, 再增加一个按钮,ID为IDC_GET,在这个按钮的响应函数中读取xml文件.
void CXmlDlg::OnGet()
{
//创建DOMDocument对象
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
MessageBox( "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运
行库! ");
}
//加载文件
pDoc-> load( "f:\\he.xml ");
//在树中查找名为City的节点, "// "表示在任意一层查找
MSXML2::IXMLDOMElementPtr childNode ;
childNode = (MSXML2::IXMLDOMElementPtr)(pDoc-> selectSingleNode( "//City "));
//得到节点类型
MSXML2::DOMNodeType nodeType;
childNode-> get_nodeType(&nodeType);
//节点名称
BSTR var;
CString name;
childNode-> get_nodeName(&var);
name = (char*)(_bstr_t)var;
//节点值
VARIANT varVal;
childNode-> get_nodeTypedValue(&varVal);
CString strValue = (char*)(_bstr_t)varVal;
//节点属性,放在链表中
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
childNode-> get_attributes(&pAttrs);
long nCount ;
pAttrs-> get_length(&nCount);
for(int i = 0 ; i < nCount ; i++)
{
pAttrs-> get_item(i,&pAttrItem);
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
//也可以直接得到
CString strAttrName = (char*)(_bstr_t)pAttrItem-> nodeName;
CString strAttrValue = (char*)(_bstr_t)pAttrItem-> nodeTypedValue;
}
晕,这个我知道,关键是它只能查找City一个节点,那其它节点如何自己遍历呢?总不能
手动吧。
MSXML2::IXMLDOMElementPtr
CXML::FindChildXMLElement(MSXML2::IXMLDOMElementPtr xml, const
LPCTSTR name)
{
MSXML2::IXMLDOMNodeListPtr nodelist = xml-> GetchildNodes();
long nCount = nodelist-> length;
for(int i=0;i
MSXML2::IXMLDOMNodePtr childnode = nodelist-> item[i];
MSXML2::DOMNodeType nodeType = childnode-> nodeType;
if(nodeType==MSXML2::NODE_ELEMENT)
{
MSXML2::IXMLDOMElementPtr xmlnode = childnode;
CString nodename = (char*)childnode-> nodeName;
if(nodename == name)
{
return xmlnode;
}
}
}
return NULL;
}