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>的文本修改为“亚胜”。
C++解析XML1.介绍 读取和设置xml配置⽂件是最常⽤的操作,TinyXML是⼀个开源的解析XML的C++解析库,能够在Windows或Linux中编译。
这个解析库的模型通过解析XML⽂件,然后在内存中⽣成DOM模型,从⽽让我们很⽅便的遍历这棵XML树。
下载TinyXML的⽹址: 使⽤TinyXML只需要将其中的6个⽂件拷贝到项⽬中就可以直接使⽤了,这六个⽂件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。
原⽂链接:XML⽤的⼈挺多,所以我也想看下怎么⽤C++解析⽣成XML。
准备⽤C++&GDIPlus仿个爱奇艺图⽚查看功能,发现⾃绘界⾯的话,各个坐标太多太乱了。
可以考虑将其坐标事先写到XML中,然后运⾏时将其读取出来,也⽅便以后的改写。
下⾯是我抄过来加了注释的代码:1 #include <iostream>2 #include "tinyxml.h"3 #include <string>45using namespace std;67enum SuccessEnum {FAILURE,SUCCESS};89 SuccessEnum loadXML(void)10 {11// XML⽂档12 TiXmlDocument doc;13// 加载XML⽂档14if (!doc.LoadFile("a.xml"))15 {16 cerr << doc.ErrorDesc() << endl;17return FAILURE;18 }1920// 定义根节点变量并赋值为⽂档的第⼀个根节点21 TiXmlElement *root = doc.FirstChildElement();22// 如果没有找到根节点,说明是空XML⽂档或者⾮XML⽂档23if (root == NULL)24 {25 cerr << "Failed to load file: No root element." << endl;26// 清理内存27 doc.Clear();28return FAILURE;29 }3031// 遍历⼦节点32for (TiXmlElement *elem = root->FirstChildElement(); elem != NULL; elem=elem->NextSiblingElement())33 {34// 获取元素名35string elemName = elem->Value();36const char *attr;37// 获取元素属性值38 attr = elem->Attribute("priority");39if (strcmp(attr,"1") == 0)40 {41// 还有⼦节点bold,bold下还有⼀段⽂本42 TiXmlElement *e1 = elem->FirstChildElement("bold");43// bold下只有⼀段⽂本元素,所以,只获取⼀次⼦元素就好44 TiXmlNode *e2 = e1->FirstChild();45// 输出⼦⽂本元素值46 cout << "priority=1\t" << e2->ToText()->Value() << endl;47 }48else if (strcmp(attr,"2") == 0)49 {50// 属性值为"2"的下⾯只有⼀段⽂本51 TiXmlNode *e1 = elem->FirstChild();52// 取出来并输出53 cout << "priority=2\t" << e1->ToText()->Value() << endl;54 }55 }56// 清理内存57 doc.Clear();58return SUCCESS;59 }6061 SuccessEnum saveXML(void)62 {63// XML⽂档64 TiXmlDocument doc;6566// 根节点(根节点名字随意)67 TiXmlElement *root = new TiXmlElement("root");68// 在⽂档中加⼊⼀个根节点69 doc.LinkEndChild(root);7071// 第⼀个元素72 TiXmlElement *element1 = new TiXmlElement("Element1"); 73// 在根节点下加⼊⼦元素74 root->LinkEndChild(element1);75// 添加⼦元素属性76 element1->SetAttribute("attribute1","some value");7778// 第⼆个元素79 TiXmlElement *element2 = new TiXmlElement("Element2"); 80// 在根节点下再次加⼊元素81 root->LinkEndChild(element2);82// 设置该元素第⼀个属性值83 element2->SetAttribute("attribute2","2");84// 设置该元素第⼆个属性值85 element2->SetAttribute("attribute3","3");8687// 第三个元素88 TiXmlElement *element3 = new TiXmlElement("Element3"); 89// 注意:这是在第⼆个元素(element2)下加⼊元素(element3) 90 element2->LinkEndChild(element3);91// 设置该元素属性值92 element3->SetAttribute("attribute4","4");9394// ⽂本元素95 TiXmlText *text = new TiXmlText("Some text.");96// 在第⼆个元素下加⼊⽂本97 element2->LinkEndChild(text);9899// 保存⽂档100bool sucess = doc.SaveFile("b.xml");101// 清理内存102 doc.Clear();103104if (sucess)105return SUCCESS;106else107return FAILURE;108 }109110int main(void)111 {112 cout << "Hello XML!" << endl;113114if (loadXML() == FAILURE)115 cout << "XML 加载失败!" << endl;116else117 cout << "XML 加载成功!" << endl;118119if (saveXML() == FAILURE)120 cout << "XML 保存失败!" << endl;121else122 cout << "XML 保存成功!" << endl;123124return0;125 }项⽬中⽤到的a.xml⽂档:1<ToDo>2<Item priority="1">3<bold>4 Book store!5</bold>6</Item>7<Item priority="2">8 book19</Item>10<Item priority="2">11 book212</Item>13</ToDo>。
读取XML到ListBox/ComboBox1,知识需求:(1)访问XML文件的两个基本模型:一,DOM模型;使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。
二,流模型;流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。
虽然是各有千秋,但我们也可以在程序中两者并用实现优劣互补。
C#采用流模型。
流模型每次迭代XML文档中的一个节点,适合于处理较大的文档,所耗内存空间小。
流模型中有两种变体——“推”push模型和pull“拉”模型。
推模型也就是常说的SAX,SAX是一种靠事件驱动的模型,也就是说:它每发现一个节点就用推模型引发一个事件,而我们必须编写这些事件的处理程序,这样的做法非常的不灵活,也很麻烦。
.NET中使用的是基于“拉”模型的实现方案,“拉”模型在遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引发事件,允许我们以编程的方式访问文档,这大大的提高了灵活性,在性能上“拉”模型可以选择性的处理节点,而SAX每发现一个节点都会通知客户机,从而,使用“拉”模型可以提高Application的整体效率。
在.NET中“拉”模型是作为XmlReader类(抽象类)实现的(2)XmlReader类Represents a reader that provides fast, non-cached, forward-only access to XML data.该类中有三个重要的衍生类:XmlTextReader;XmlTextValidatingReader;XmlNodeReader(3)XmlNodeType枚举该枚举里面有很多实用的数。
我用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程。 已知有一个XML文件(bookstore.xml)如下: Corets, Eva 5.95 1、插入节点 往节点中插入一个节点:
XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找 XmlElement xe1=xmlDoc.CreateElement("book");//创建一个节点 xe1.SetAttribute("genre","李赞红");//设置该节点genre属性 xe1.SetAttribute("ISBN","2-3631-4");//设置该节点ISBN属性
XmlElement xesub1=xmlDoc.CreateElement("title"); xesub1.InnerText="CS从入门到精通";//设置文本节点 xe1.AppendChild(xesub1);//添加到节点中 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);//添加到节点中 xmlDoc.Save("bookstore.xml"); 结果为: Corets, Eva 5.95 候捷 58.3 2、修改节点: 将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点的文本修改为“亚胜”。
XML 遍历并读取XML文件数据
无论采用任何方式解析XML文档,其最终目的就是获取XML文档中的数据,并利用这些数据进行操作。
基于SAX的解析器利用文本数据事件,可以将这些数据一一显示。
通过本练习读者可以学习SAX解析XML文件的步骤和过程。
其实现步骤如下所示:
(1)分析程序。
使用SAX解析器实现解析XML文档,需要编写XML文档和解析程序。
解析程序需要创建解析器和事件处理器。
(2)创建Example13.xml文件,实现XML文档编写。
在动手编写XML文档之前,需要设计XML文档中的数据结构。
(3)编写XML文档。
该XML文档代码如下所示:
上述代码中,main方法中主要创建解析器和事件处理器。
MyHandler类中实现事件处理器。
(6)实现读取XML文档数据代码。
如下所示:
(7)运行该程序。
打开命令提示符,编译并解释执行该Java程序,其窗口如图7-1所示:
图7-1 获取XML文件数据。
c语言遍历数组的三种方法方法 1:下标索引下标索引是最直接的遍历数组方法,使用数组的索引来访问元素。
索引从 0 开始,表示数组中的第一个元素。
```cint arr[] = {1, 2, 3, 4, 5};int length = sizeof(arr) / sizeof(int);for (int i = 0; i < length; i++) {printf("%d ", arr[i]);}```方法 2:指针算术指针算术使用指针来遍历数组。
指针存储数组元素的地址,可以通过算术运算递增或递减指针来访问相邻元素。
```cint arr[] = {1, 2, 3, 4, 5};int ptr = arr;while (ptr < &arr[length]) {printf("%d ", ptr++);}```方法 3:范围 for 循环C99 中引入了范围 for 循环,它使用更简洁的语法来遍历数组。
范围 for 循环将自动创建和递增迭代变量,直到达到数组末尾。
```cint arr[] = {1, 2, 3, 4, 5};for (int i : arr) {printf("%d ", i);}```比较下标索引是最常见的遍历方法,易于理解和实施。
指针算术提供了对数组更低级别的访问,允许进行更高级的操作。
范围 for 循环是最简洁的遍历方法,但仅适用于 C99 及更高版本。
选择方法选择哪种遍历方法取决于具体需求。
下标索引通常是最简单且最有效的选择。
如果需要对数组进行更高级的操作,则指针算术可能是一个更好的选择。
范围 for 循环是最简洁的选择,但仅限于C99 及更高版本。
xml⽂件简单读取,循环遍历xml⽂件的简单读取出来⽣成dom4j.Document对象树,循环遍历获取节点例⼦:import java.util.Iterator;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class Dom4jText {/*** @param args*/public static void main(String[] args) {try {//创建解析器SAXReader saxReader=new SAXReader();//通过解析器将xml读取到内存中,⽣成对象树Document document=saxReader.read("conf/student.xml");//获取根节点Element root=document.getRootElement();//遍历根节点for(Iterator<Element> rootlter=root.elementIterator();rootlter.hasNext();){Element student=rootlter.next();for(Iterator<Element> innerlter=student.elementIterator();innerlter.hasNext();){Element innerElt=innerlter.next();String name=innerElt.getName();String value=innerElt.getStringValue();System.out.println("name========="+name+"======value========="+value);}System.out.println("-------------------------------");}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}程序⽤到xml:<?xml version="1.0" encoding="UTF-8"?><students><student><name>张三</name><age>11</age><adress>浙江省是打发斯蒂芬⼆⼈11</adress></student><student><name>李四</name><age>22</age><adress>浙江省是打发斯蒂芬⼆⼈22</adress></student><student><name>王⼆⿇⼦</name><age>33</age><adress>浙江省是打发斯蒂芬⼆⼈33</adress></student></students>。
我们建立一个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;
}