如何用vc创建和读取xml文件
VC++ xml解析
三种最流行的开放源码XML 库是expat、libxml 和Xerces。
第一部分:DOM解析:概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。
这样会要把XML文档全部都加载到内在中。
所以解析起来的速度会要慢一些。
1、如何加载xml文件://创建DOM,加载XML文档MSXML::IXMLDOMDocumentPtr pCommandDoc;pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));pCommandDoc->put_async(V ARIANT_FALSE);pCommandDoc->put_validateOnParse(VARIANT_FALSE);pCommandDoc->put_resolveExternals(V ARIANT_FALSE);pCommandDoc->put_preserveWhiteSpace(V ARIANT_TRUE);pCommandDoc->load(file.GetBuffer(0));2、在XML文档中查找指定的结点://找到MSXML::IXMLDOMNodePtrpRootNode=pCommandDoc->selectSingleNode("root/record");if (pRootNode==NULL){return ;}3、得到XML文档中,结点的属性CString strTemp;MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;pRootNode->get_attributes(&pAttrs);if (pAttrs==NULL){return;}MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");_bstr_t strRequestType=pRequestTypeAttr->Gettext();strTemp=strRequestType.operator char *();4、得到结点的内容_bstr_t strVisiPort=pNode->Gettext();5、设置结点的内容HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));6、设置一个属性内容IXMLDOMAttribute *pa=NULL;bstr = SysAllocString(L"属性1");pXMLDom->createAttribute(bstr,&pNode);var = VariantString(L"strin");pa->put_value(var);pRoot->setAttributeNode(pa, &pa1);第二部分、如何使用SAX解析概述:SAX使用的是加载式的,将会把XML文档分断,加载到内存中。
利用CMarkup生成XML文件
创建一个XML文档对于创建一个XML文档,需要实例化一个CMarkup对象,并调用AddElem创建根元素。
.在这个位置,如果你调用AddElem("ORDER") ,你的文档会简单的装一个空ORDER元素<ORDER/>. 然后调用AddChildElem 在根元素的下面创建元素(例如:“进入”根元素内部,层次表示).下面的示例代码创建一个XML文档并返回它(的内容)到一个字符串中。
CMarkup xml;xml.AddElem( "ORDER" );xml.AddChildElem( "ITEM" );xml.IntoElem();xml.AddChildElem( "SN", "132487A-J" );xml.AddChildElem( "NAME", "crank casing" );xml.AddChildElem( "QTY", "1" );CString csXML = xml.GetDoc();这些代码产生了下面的XML,这个根结点是ORDER元素;注意它的开始标签<ORDER> 在开头,结束标签</ORDER>在结尾。
当一个元素是在一个父下面(深入或被包含),这个父元素的开始标签要在它之前,结束标签要在它之后。
ORDER元素包含一个ITEM元素,而ITEM元素包含了三个字子元素:SN、NAME和QTY;<ORDER><ITEM><SN>132487A-J</SN><NAME>crank casing</NAME><QTY>1</QTY></ITEM></ORDER>如例子中所显示的,你也能够在一个子元素下创建新元素,这需要调用IntoElem 移动你的当前主位置到当前子元素位置,然后你就可以在这下面增加一个子元素了。
VC++使用DOM操作XML文档
收 稿 日期 ;0 80 —2 2 0 —40 责 任 编辑 : 张 军
这 些 对象 包 含结 点 的添 加 、 除 和浏 览 等基 本 删 的功 能 。利用这些 功能可 以对 X ML文档 进行 各 种 操作 。对 象级 的操 作 比起 直接 对文本 操作 要容 易得 多, 也要 直观得 多 。
2 X ML文 档
XML文 档 由 D D 和 XML 文 本 组 成 , T T D D
作 者 简 介 : 玉 霞 ( 9 8) 女 , 北 无 极 人 , 要 从 事 经 济 信 息 郭 17 一, 河 主
的计 算 机 化 管理 工 作 。
( o u n y ed f io 是 一组 标记符 的语法 规 d cme t p ei t n) t ni 则, 明 X 表 ML 文本 是 怎么 样 组 织 的 , 如 D D 可 比 T
XML OMTet D x
描 绘 XML文 档 元 素 或 属性 的 文本 内容
1 D M 模 型 O
D OM 模型 需要 对整 个 X ML文档 进行 扫描 , 然 后解 析生成 一个 对象 树 , ML文 档 中的所 有 元 素 、 X 元素 属性 、 文本 都是 用对 象来 表示 , 而不是孤 立 的文 本 。表 l简 单 介 绍 了 D OM 包 含 的 重 要 基 本 对
V o . 5, 1 2 No. 4
J l 0 8 uy2 0
文 章编 号 :0 8 1 3 ( 0 8 0 — 2 0 0 1 0 — 5 4 2 0 ) 4 0 5 —2
VC ++使用 D OM 操作 X ML文档
郭 玉霞
( 北省经 济信息 中心信 息 市场 处 , 河 河北石 家庄 0 05 ) 5 0 1
C#中读取xml文件指定节点
C#中读取xml文件指定节点假设xml文件内容是<?xml version="1.0" encoding="utf-8"?><Workflow><Activity><ActivityId>1</ActivityId><ActivityName>start</ActivityName><BindingPageId>1</BindingPageId><BindingRoleId>1</BindingRoleId><ActivityLevel>1</ActivityLevel></Activity><Activity><ActivityId>2</ActivityId><ActivityName>pass</ActivityName><BindingPageId>2</BindingPageId><BindingRoleId>2</BindingRoleId><ActivityLevel>2</ActivityLevel></Activity></Workflow>我们需要读取Activity节点下的内容,因为存在多个Activity,所以需要读取多个节点。
可以使用XmlDocument.SelectSingleNode和XmlDocument.SelectNodes方法查找节点。
前一个是查找匹配的第一个节点,而后一个则会返回一个节点列表。
1.XmlDocument.SelectSingleNode方法的使用首先创建一个读取xml文件的方法ReadXmlNode/// <summary>/// 读取xml中的指定节点的值/// </summary>public void ReadXmlNode(string filename){XmlDocument xmlDoc = new XmlDocument();try{xmlDoc.Load(filename);//读取Activity节点下的数据。
C语言读写XML文档:libmxml库初学笔记(Mini-XML)
C语⾔读写XML⽂档:libmxml库初学笔记(Mini-XML)使⽤XML存取数据很⽅便。
官⽹有详尽的英⽂⼿册,这⾥还找到了⼀份中⽂⼿册:这⾥只放⾃⼰学习时写的测试代码,有兴趣的同学可以做个参考。
#include<mxml.h>//创建xml⽂档//声明创建 xml树需要的 node节点mxml_node_t* xml; // xml格式标记mxml_node_t* keys_n; // 词汇库,unkey-词汇主键的⽗节点mxml_node_t* unikey_n; //⼀条词汇记录的基本单元,mark-词汇标签和 explain-词汇释义的⽗节点mxml_node_t* elem_n; //创建 mark explain 的节点//在内存中通过挂载node节点,构建 xml treexml=mxmlNewXML("1.0");//创建xml⽂档格式标记,必须,xml tree的根keys_n=mxmlNewElement(xml, "keys");//新节点,名为keys,挂载到 xmlunikey_n=mxmlNewElement(keys_n, "unikey");//新节点,名为unikey,挂载到 keysmxmlElementSetAttr(unikey_n, "word", "go alpha");//为unikey_n的节点设置属性:word="go alpha"elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikeymxmlElementSetAttr(elem_n, "element", "mark");//为elem_n的节点设置属性:element="mark"mxmlNewText(elem_n, 0, "AI");//为elem_n的节点新增⽂本,⽂本前的whitespace(空格)个数为0,内容为”AI”elem_n=mxmlNewElement(unikey_n, "elem");//新节点,名为elem, 挂载到unikeymxmlElementSetAttr(elem_n, "element", "explain");//为elem_n的节点设置属性:element="explain"mxmlNewText(elem_n, 0, "Google的AI程序");//为elem_n的节点新增⽂本,⽂本前的whitespace(空格)个数为0//将内存中创建的节点树写⼊⽂件FILE *fp = fopen("/Users/yaou/Area/tmp/xmltest-1.xml", "w");mxmlSaveFile(xml, fp, MXML_NO_CALLBACK);//关闭⽂件fclose(fp);//释放内存中的节点树mxmlDelete(xml);之后⼿动在新⽂件xmltext-1.xml ⾥添加⾥⼀些节点。
读写XML的四种方法
读写XML的四种方法XML(eXtensible Markup Language)是一种用于表示和传输数据的标记语言。
它具有良好的可读性和扩展性,被广泛应用于Web开发、数据交换和配置文件等领域。
在读写和处理XML数据时,有许多方法可供选择。
本文将介绍四种常见的读写XML的方法:DOM、SAX、JDOM、和XMLStreamReader/XMLStreamWriter。
1. DOM(Document Object Model):DOM是一种基于树形结构的解析器,它将整个XML文档加载到内存中,并将其表示为一个对象树。
在DOM中,每个XML元素都被表示为一个节点(Node),可以通过节点的属性和方法对其进行操作。
读取XML文档时,可以使用DOM解析器将其转换为一个DOM树,然后通过节点的方法访问和修改树结构。
写入XML文档时,可以通过创建和修改节点来构建DOM树,并使用DOM解析器将其保存为XML文档。
使用DOM读取XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象解析XML文档,并返回一个Document对象。
- 通过Document对象的方法遍历和操作XML文档的节点。
使用DOM写入XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象创建一个Document对象。
- 通过Document对象的方法创建和添加元素节点、属性节点等。
- 使用TransformerFactory和Transformer对象将Document对象保存为XML文档。
DOM的优点是易于使用和理解,可以方便地遍历和修改XML文档。
c解析xml常用方法
c解析xml常用方法解析XML是指将XML文档中的数据提取与分析的过程。
XML是一种标记语言,用于描述数据的结构与内容。
常用的XML解析方法包括DOM、SAX和StAX。
DOM解析:DOM(Document Object Model)是一种将XML文档表示为文档树的解析方法。
DOM解析将整个XML文档加载到内存中,并构建一个树形结构,可以方便地对XML文档进行遍历和操作。
常用的DOM解析类包括DocumentBuilder和Document类。
1.创建DOM解析器:```javaDocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(;DocumentBuilder builder = factory.newDocumentBuilder(;```2.加载XML文档:```javaDocument document = builder.parse(new File("file.xml")); //通过文件Document document = builder.parse(inputStream); //通过输入流Document document = builder.parse(url); //通过URL```3.获取根节点:```javaElement rootElement = document.getDocumentElement(;```4.遍历子节点:```javaNodeList nodeList = rootElement.getChildNodes(;for (int i = 0; i < nodeList.getLength(; i++)Node node = nodeList.item(i);if (node.getNodeType( == Node.ELEMENT_NODE)Element element = (Element) node;//处理子节点}```SAX解析:SAX(Simple API for XML)是一种基于事件驱动的解析方法。
c#读写XML文件
System.Xml命名空间包含了一些最重要的XML类,其中最主要的类是和XML文档的读写操作相关的类。这些类中包括4个与读相关的类以及2个与写相关的类。它们分别是:XmlReader、XmlTextReader、 XmlValidatingReader、XmlNodeReader、XmlWriter以及 XmlTextWriter。本文将重点介绍这些类,因为它们是最基本也是最重要的类。
XmlNode类是一个非常重要的类,它代表了XML文档中的某个节点。该节点可以是XML文档的根节点,这样它就代表整个XML文档了。它是许多很有用的类的基类,这些类包括插入节点的类、删除节点的类、替换节点的类以及在XML文档中完成导航功能的类。同时,XmlNode类还为程序员提供了获取双亲节点、子节点、最后一个子节点、节点名称以及节点类型等的属性。它的三个最主要的子类包括: XmlDocument、XmlDataDocument以及XmlDocumentFragment。XmlDocument类代表了一个XML文档,它提供了载入和保存XML文档的方法和属性。这些方法包括了Load、LoadXml和Save等。同时,它还提供了添加特性(Attributes)、说明(Comments)、空间(Spaces)、元素(Elements)和新节点(New Nodes)等XML项的功能。XmlDocumentFragment类代表了一部分XML文档,它能被用来添加到其他的XML文档中。 XmlDataDocument类可以让程序员更好地完成和中的数据集对象之间的互操作。
using System;
using System.Xml;
namespace ReadXml
{
class Class1
{
vc6.0写xml案例
vc6.0写xml案例在VC6.0中编写XML的案例,可以通过使用MSXML库来实现。
下面我将从多个角度来介绍如何在VC6.0中编写一个简单的XML案例。
1. 包含头文件和初始化。
首先,在VC6.0中创建一个新的Win32控制台应用程序项目。
然后在代码中包含MSXML库的头文件,可以使用以下代码:c.#include <msxml2.h>。
接着,需要初始化COM组件,可以使用以下代码:c.CoInitialize(NULL);2. 创建XML文档。
接下来,我们可以创建一个XML文档对象并添加元素和属性。
以下是一个简单的示例代码:c.IXMLDOMDocument pXMLDom = NULL;HRESULT hr = CoCreateInstance(__uuidof(DOMDocument), NULL, CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument,(void)&pXMLDom);if (SUCCEEDED(hr))。
{。
IXMLDOMElement pRoot = NULL;pXMLDom->createElement(L"Root", &pRoot);pXMLDom->appendChild(pRoot, NULL);IXMLDOMElement pChild = NULL;pXMLDom->createElement(L"Child", &pChild);pRoot->appendChild(pChild, NULL);pChild->setAttribute(L"Attribute",_variant_t(L"Value"));}。
3. 保存和释放资源。
在完成XML文档的创建后,我们需要保存XML文档并释放资源。
VC6.0编的“文件读写”的详细操作步骤(两种方式:MFC和基于对话框)
VC6.0编的“文件读写”的两种方式(MFC和基于对话框)软件实验三:基于对话框的MFC程序实现文件读写操作实例一:操作步骤:1、新建“MFC APPWIZARD(EXE)”,选择文件路径,输入文件名,选择应用程序类型为“基本对话框”,按上图添加各控件2、按下表修改各控件的ID号,添加成员函数和消息函数控件的ID号,选择mumber variables面板,单击add variable按钮,添加成员变量,并选择变量类型。
3、写入文件1)在“基于对话框的文件读写Dlg.h”文件中定义变量(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsTextFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)双击下压按钮“写入文件”,编写“写入文件”的消息处理函数void CMyDlg::OnButtonWrite() //单击“写入到文件”按钮{// TODO: Add your control notification handler code hereUpdateData(true);CFile file;CFileDialog filedlg(0,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK)strFileName=filedlg.GetFileName();//获得文件名if(strFileName==""){AfxMessageBox("请输入文件名");return;}file.Open(strFileName,CFile::modeCreate|CFile::modeWrite);//将数据写入文件int length=m_WriteString.GetLength();//获取文件长度file.Write((LPCTSTR)m_WriteString,length);//获取有关文件的信息CString AfxMessageBox("已保存到文件:"+strFileName+"!");//保存结束提示strFilePath=file.GetFilePath();//获得文件的路径file.Close();//关闭文件}4、查看文件路径双击下压按钮“查看文件路径”,编写“查看文件路径”的消息处理函数void CMyDlg::OnButtonFilepath() //查看文件路径{// TODO: Add your control notification handler code herem_FilePath=strFilePath;UpdateData(false);}5、读入文件1)定义判断文件类型是否正确的函数(粗体字为此处添加的代码)class CMyDlg : public CDialog{// Constructionpublic://定义变量CString strFileName;//文件名CString strFilePath;//文件路径BOOL IsT extFile(CString& rFile);//判断文件类型是否正确CMyDlg(CWnd* pParent = NULL); // standard constructor………}2)编写IsTextFile函数BOOL CMyDlg::IsTextFile(CString &rFile)//判断文件类型是否正确{CStringList strList;CString str(rFile);strList.AddHead(".TXT");strList.AddHead(".SYS");strList.AddHead(".BA T");strList.AddHead(".DA T");str=str.Right(4);//文件名的右边四位字符str.MakeUpper();//转换成大写return(strList.Find(str))?TRUE:FALSE;}3)在“基于对话框的文件读写Dlg.cpp”文件开头添加头文件#include "fstream.h"//添加的头文件4)单击下压按钮“读入文件”,编写下压按钮“读入文件”的消息函数void CMyDlg::OnButtonRead(){// TODO: Add your control notification handler code herefstream f1;//定义文件流对象char s[200];CFileDialog filedlg(1,//1-文件打开,0-文件另存为".txt|*.*",NULL,OFN_OVERWRITEPROMPT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);if(filedlg.DoModal()==IDOK){UpdateData(true);strFileName=filedlg.GetFileName();//获得文件名if(!IsTextFile(strFileName))//判断文件类型是否正确{AfxMessageBox("文件类型不正确");return;}f1.open(strFileName,ios::in|ios::nocreate);while(!f1.eof()){f1.getline(s,255);m_strRead=m_strRead+"\r\n"+s;//添加文件中的文本到编辑框UpdateData(false);}AfxMessageBox(strFileName+"文件读入完毕");//保存结束提示f1.close();//关闭文件流}}6、运行程序1)在写入文件的编辑框中输入内容,单击“写入文件”按钮,并可选择路径保存该文件。
C中对XML文件的操作
Xml作为一个非常重要的纯文本格式已经进入了编程的很多领域,作为一个面向应用层面的c#也一样在很多领域离不开Xm l。
但是,c#在很多方面对X ml做了写封装,以至于很多操作Xml的代码,都不需要手动去写。
例如,c#写WebSer vice这种需要大量操作Xml的服务,除了极其个别的情况下,基本看不到任何操作Xml的代码。
这是c#的一个优势,但是,最近发现正是这样一些c#的优势,导致了新一代c#程序员的能力退化。
因为90%的情况下,不需要手动操作Xml,所以,年轻的c#程序员也觉得没必要为了这10%的情况,而去学如何手工读写Xml。
真不知道,ms 提供了这么简便的工具,是ms做的善事还是作的孽。
好吧,废话就不说了,转入主题。
1.如何用XmlDom的方式读取XmlXml Dom方式是最原始的一种操作Xml的途径,从.net Framewo rk 1.0开始就开始支持Dom方式。
1.1如何以Dom方式加载Xm l要读取Xml首先要加载Xm l,加载的方式有两种,一种是从流或类似的Read er加载,例如:当然还可以从字符串加载:1.1读取无nam espace的XmlXml已经准备好了,下面就开始读取这个Xml。
现在希望读取d ata节下面的所有ite m中的tex t,那么就可以:看看运行结果:但是,这样写的问题有很多,例如在data节点中有非i tem的节点,这样访问,也就被无差别的把非item项也写出来了。
例如把如果数据改成这样:这样,在data节里面,除了4个ite m,还有一个oth er,这个other是不需要的,必须被排除掉,如果直接用第一中Child Nodes去访问的话,会得到这样的结果:显然“!@#”也被选择出来了,这可不是我们所期望的,所以,改用XPath的方式访问:其运行结果为:很好的othe r项排除在需要的节点外,这才是我们真正想要的结果:)1.2读取有nam espace的Xml和c#一样Xml也有namesp ace,并且names pace在X ml中的作用巨大,也许你并未感受到names pace的作用,但是,你可能已经不得不面对那些有namesp ace的Xm l了。
c++读取处理xml文件的实例
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")) {。
怎样用vc++读写xml文件
用微软的DOM,MSXML4//引入msxml4.dll#import "C:\WINNT.0\system32\msxml4.dll"//创建XMLDOMDocument指针MSXML2::IXMLDOMDocumentPtr pXMLDoc;// 初始化COM接口::CoInitialize(NULL);// 通过智能指针创建一个解析器的实例HRESULT hr;hr =pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));//加载文件pXMLDoc->load("f:\\he.xml");//在树中查找名为City的节点,"//"表示在任意一层查找MSXML2::IXMLDOMElementPtr childNode ;childNode = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//AUTHOR")); //得到节点类型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 = (MSXML2::IXMLDOMElementPtr)(pXMLDoc->selectSingleNode("//NUM"));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;}另外可以用MSXML DOM创建一个文档对象的过程。
c++xml的读写代码
c++xml的读写代码在C++ 中,你可以使用库来读写XML 文件。
常见的库有RapidXML、TinyXML 和pugixml。
以下是一个使用pugixml 的简单示例来读写XML 文件的代码:首先,你需要下载并安装pugixml 库。
然后,你可以按照以下步骤创建一个简单的C++ 程序:```cpp#include <iostream>#include <pugixml.hpp>int main() {// 创建一个XML 文档pugi::xml_document doc;// 添加根节点pugi::xml_node root = doc.append_child("root");// 添加子节点pugi::xml_node child = root.append_child("child");child.append_child(pugi::node_pcdata).set_value("Hello, XML!");// 保存XML 到文件doc.save_file("example.xml");// 从文件加载XMLpugi::xml_document loadedDoc;pugi::xml_parse_result result = loadedDoc.load_file("example.xml");if (result) {std::cout << "XML file loaded successfully." << std::endl;// 获取根节点pugi::xml_node loadedRoot = loadedDoc.child("root");// 遍历子节点for (pugi::xml_node childNode = loadedRoot.child("child"); childNode; childNode = childNode.next_sibling("child")) {std::cout << "Child content: " << childNode.child_value() << std::endl;}} else {std::cout << "Failed to load XML file. Error description: " << result.description() <<std::endl;}return 0;}```上述代码中,pugixml 被用来创建、修改和解析XML。
【XML】--C#读取XML中元素和属性的值
【XML】--C#读取XML中元素和属性的值Xml是扩展标记语⾔的简写,是⼀种开发的⽂本格式。
啰嗦⼏句⼉:⽼师布置的⼀个⼩作业却让我的脑细胞死了⼀堆,难的不是代码,是n多嵌套的if、foreach,做完这个,我使劲⼉想:我⼀⼥孩,没有更多⼥孩的⽣活整天对着电脑学,累的不⾏但这⽔平就不见长,哪⼉出错了呢?----脑袋⽠⼦不够⽤。
哎,来句⽼师的话缓解⼀下:“JUST DO IT!很多孩⼦听了的话,从此进⼊IT⾏业~~~”over,我还是把这个简单但却打击了我下的⼩东西共享下吧。
^_~⽤C#读取xml有很多⽅式,这⾥我就先使⽤XmlDocument读取Xml,⽤⼀段代码遍历所有元素,并打印student的所有属性和⼦节点的值。
1、school.xml,如下:<?xml version="1.0" encoding="UTF-8"?><!--启明培训学校学⽣信息:1、⼀年级学⽣2、⼆年级学⽣--><school name="启明培训学校"><grades><grade id="1" name="⼀年级"><classes><class id="101" name="⼀班"><teachers><teacher teach="语⽂"><teacherName><![CDATA[王军]]></teacherName></teacher><teacher teach="数学"><teacherName><![CDATA[周杰]]></teacherName></teacher></teachers><students><student id="10101"><name>亢阳</name><sex>⼥</sex></student><student id="10102"><name>⽥镇南</name><sex>男</sex></student><student id="10103"><name>刘嘉</name><sex>⼥</sex></student></students></class></classes></grade><grade id="2" name="⼆年级"><classes><class id="201" name="⼆班"><teachers><teacher teach="语⽂"><teacherName><![CDATA[胡军]]></teacherName></teacher><teacher teach="数学"><teacherName><![CDATA[王洁]]></teacherName></teacher></teachers><students ><student id="20101"><name>胡艳</name><sex>⼥</sex></student><student id="20102"><name>张三</name><sex>男</sex></student><student id="20103"><name>李四</name><sex>⼥</sex></student></students></class></classes></grade></grades></school>2、XMLReader.cs (我⽤的是控制台应⽤程序,直接附上全部代码吧)1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;56 using System.Xml;78 namespace XMLReader9 {10 class XMLReader11 {12 static void Main(string[] args)13 {14 string xmlFilePath = "school.xml";15 XmlDocument doc = new XmlDocument();16 doc.Load(xmlFilePath);1718 //学校使⽤xpath表达式选择⽂档中所有的schoo的⼦节点19 XmlNodeList schoolNodeList = doc.SelectNodes("/school");20 if (schoolNodeList != null)21 {22 foreach (XmlNode schoolNode in schoolNodeList)23 {24 //通过Attributes获得属性名为name的属性25 string schoolName = schoolNode.Attributes["name"].Value;26 Console.WriteLine("学校:" + schoolName);2728 #region 年级29 //通过SelectSingleNode⽅法获得当前节点下的grades⼦节点30 XmlNode gradesNode = schoolNode.SelectSingleNode("grades");31 if (gradesNode != null)32 {33 //通过ChildNodes属性获得grades的所有⼀级⼦节点34 XmlNodeList gradeNodeList = gradesNode.ChildNodes;35 if (gradeNodeList != null)36 {37 foreach (XmlNode gradeNode in gradeNodeList)38 {39 Console.WriteLine("\t");40 Console.WriteLine("年级:" + gradeNode.Attributes["name"].Value + " ID:" + gradeNode.Attributes["id"].Value);4142 #region 班级43 //通过SelectSingleNode⽅法获得当前节点下的classes⼦节点44 XmlNode classesNode = gradeNode.SelectSingleNode("classes");45 if (classesNode != null)46 {47 //通过ChildNodes属性获得classes的所有⼀级⼦节点48 XmlNodeList classNodeList = classesNode.ChildNodes;49 if (classNodeList != null)50 {51 foreach (XmlNode classNode in classNodeList)52 {53 Console.WriteLine(" 班级:" + classNode.Attributes["name"].Value + " ID:" + classNode.Attributes["id"].Value);5455 #region ⽼师56 XmlNode teachersNode = classNode.SelectSingleNode("teachers");57 if (teachersNode != null)58 {59 XmlNodeList teacherNodeList = teachersNode.ChildNodes;60 if (teacherNodeList != null)61 {62 foreach (XmlNode teacherNode in teacherNodeList)63 {64 XmlNode teacherNameNode = teacherNode.FirstChild;65 XmlCDataSection cdate = (XmlCDataSection)teacherNameNode.FirstChild;66 if (cdate != null)67 {68 Console.WriteLine(" "+teacherNode.Attributes["teach"].Value + "⽼师:"+cdate.InnerText.Trim());6970 }71 }72 }73 }74 #endregion ⽼师7576 #region 所有学⽣77 XmlNode studentsNode = classNode.SelectSingleNode("students");78 if (studentsNode != null)79 {80 XmlNodeList studentNodeList = studentsNode.ChildNodes;81 if (studentNodeList != null)82 {83 foreach (XmlNode studentNode in studentNodeList)84 {85 Console.WriteLine(" 学⽣:" + studentNode.Attributes["id"].Value);8687 //获取student的属性值name和⽂本88 XmlNode stu1 = studentNode.FirstChild;89 XmlElement xe1 = (XmlElement)stu1;90 if (xe1 != null)91 {92 Console.WriteLine(" 姓名:" + xe1.InnerText.Trim());93 }94 //获取student的属性值sex和⽂本95 XmlNode stu2 = stChild;96 XmlElement xe2 = (XmlElement)stu2;97 if (xe2 != null)98 {99 Console.WriteLine(" 姓别:" + xe2.InnerText.Trim()); 100 }101 }102 }103 #endregion 所有学⽣104 }105 }106 }107 #endregion 班级108 }109 }110 }111 #endregion 年级112 Console.Write("\r\n按随意键跳出");113 Console.ReadKey();114 }115116 }117 }118 }119 }120 }ok,运⾏,如图:-- 后记,学的xml不多,做完之后,我不得不对⾃⼰说:IT,要学的太多了,...>_<...。
C语言操作XML
简单的例子
• encoding=“utf-8" 表示该文档采用utf-8编码,采用哪种编码 取决于你所用到的字符集 • "<body>"是文档的主体部分 • 注意:标签必须是成对出现,有开始有结束“</body>”, 文档中只能有一个根元素
稍微复杂的例子
• <?xml version="1.0" encoding="utf-8"?> • <data> • <node name="test" prog="1.sh"></node> • <node name="中文测试" prog="2.sh"></node> • </data> • 一个文档中只能包含一个根元素,根元素可以包含任意子 元素 • 一个元素中可以包含0个或多个属性 • 元素可以为空元素,空元素表示该元素中没有包含文本元 素
练习
• 安装mxml库到linux系统中 • 1、使用mxml库创建一个xml文件: • led_config.xml • 2、使用mxml库读取led_config.xml,将zipfile和两个href的 值使用printf输出
C语言实现的mxml库
• • • • • • • • • / 最新版本2.7 下载mxml-2.7.tar.gz进行安装 cat README ./configure make make install cp /usr/local/lib/libmxml.* /lib/ 将所有安装的库文件拷贝到lib目录下
特殊字符
• • • • • • 在 XML 中有 5 个预定义的实体引用 < < 小于 > > 大于 & & 和号 ' ' 省略号 " " 引号
c#通用配置文件读写类与格式转换(xml,ini,json)
c#通⽤配置⽂件读写类与格式转换(xml,ini,json).NET下编写程序的时候经常会使⽤到配置⽂件。
配置⽂件格式通常有xml、ini、json等⼏种,操作不同类型配置⽂件需要使⽤不同的⽅法,操作较为⿇烦。
特别是针对同时应⽤不同格式配置⽂件的时候,很容易引起混淆。
如果使⽤⼀个统⼀的⽅法对其进⾏操作,岂不美哉。
技术⽅案思路很简单,就是使⽤⼀个基类将配置⽂件的内容抽象出来,不同配置⽂件有不同的实现,对外统⼀调⽤⽅法。
最开始,打算⾃⼰写⼀个,后来对⽐ini与xml的时候(最开始没有把json考虑进来,⾃⼰⽤它来做配置⽂件的项⽬较少),发现xml完全可以替代ini⽂件的描述,直接⽤xml不是更好?于是⽅案就变成了⽤xml作为最基础的数据对象,其他配置⽂件转换成xml进⾏操作。
XDocument VS XmlDocment不解释,直接看图。
ini <-> xmlini⽂件构造⽐较简单,常见的ini有以下⼏条规范:注释以;开头,⼀直到⾏尾;类别项⽤[]包围,占据⼀整⾏;类别项下可以有多个配置项,直到下⼀个类别项或EOF结束;配置项格式:key=valueini格式是⼆级配置结构:类别>key。
通过类别和key就可以唯⼀获得⼀个值。
public static XDocument ToXml(this string[] iniStr){//ini没有根节点是不能直接转成xml的。
XDocument xdoc = new XDocument(new XElement("G" + Guid.NewGuid().ToString("N")));XElement node = xdoc.Root;foreach (var line in iniStr){var cline = line.Trim();if (string.IsNullOrWhiteSpace(cline)) continue;switch (line[0]){case ';':node.Add(new XComment(cline.Substring(1)));break;case '[':node = new XElement(cline.Substring(1, line.Length - 2));xdoc.Root.Add(node);break;case '\r':break;default:int index = cline.IndexOf('=');if (index < 1){throw new InvalidOperationException("Property does not contains '=' operator");}node.Add(new XElement(cline.Substring(0, index).Trim(), cline.Substring(index + 1)));break;}}return xdoc;}ini适合⽐较简单的配置读取,⽂件可读性强,读写也简单;⽽xml具有多级结构,复杂,还有dtd,xslt什么的,相对来说⽐较全⾯。
用C#创建XML,XML格式化输出
⽤C#创建XML,XML格式化输出demo:XmlDocument doc = new XmlDocument();XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "GB2312", null);doc.AppendChild(dec);//创建⼀个根节点(⼀级)XmlElement root = doc.CreateElement("First");doc.AppendChild(root);//创建节点(⼆级)XmlNode node = doc.CreateElement("Seconde");//创建节点(三级)XmlElement element1 = doc.CreateElement("Third1");element1.SetAttribute("Name", "Sam");element1.SetAttribute("ID", "665");element1.InnerText = "Sam Comment";node.AppendChild(element1);XmlElement element2 = doc.CreateElement("Third2");element2.SetAttribute("Name", "Round");element2.SetAttribute("ID", "678");element2.InnerText = "Round Comment";node.AppendChild(element2);root.AppendChild(node);doc.Save(@"d:\bb.xml");Console.Write(doc.OuterXml);格式化输出函数:private static string formatXml(object xml){XmlDocument xd;if(xml is XmlDocument) {xd=xml as XmlDocument;}else{xd = new XmlDocument();xd.LoadXml(xml as string);}StringBuilder sb = new StringBuilder();StringWriter sw = new StringWriter(sb);XmlTextWriter xtw = null;try{xtw = new XmlTextWriter(sw);xtw.Formatting = Formatting.Indented;xtw.Indentation = 1;xtw.IndentChar = '\t';xd.WriteTo(xtw);}finally{if (xtw != null)xtw.Close();}return sb.ToString();}。
C#读取和写入XML文件
C#读取和写⼊XML⽂件关于xml是属于⼀个⽐较重要的东西,在平时开发的过程中,这块内容最主要的是要掌握XML内容的读取和写⼊操作。
⼀.什么是XML?XML 指可扩展标记语⾔(EXtensible Markup Language)XML 是⼀种标记语⾔,很类似HTMLXML 的设计宗旨是传输数据,⽽⾮显⽰数据XML 标签没有被预定义,您需要⾃⾏定义标签XML 被设计为具有⾃我描述性XML 是W3C 的推荐标准⼆.XML语法:1.⼀个XML包含以下⼏部分内容:⽂档声明,元素,属性,注释,CDATA(特殊字符),处理指令2.最简单的声明格式 <?xml version="1.0" ?> ⽤encoding属性声明⽂档的编码 <?xml version="1.0" encoding="UTF-8" ?> ⽤standalone属性说明⽂档是否独⽴ <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>三.XML⽂件的读取:xml⽂件内容:<?xml version="1.0" encoding="utf-8"?><library id="30"><BOOK id="20"><name>⾼等数学</name><name1>⼤学英语</name1></BOOK></library>读取XML内容:static void Main(string[] args){//将XML⽂件加载进来XDocument document = XDocument.Load("D:\\123.xml");//获取到XML的根元素进⾏操作XElement root= document.Root;XElement ele= root.Element("BOOK");//获取name标签的值XElement shuxing= ele.Element("name");Console.WriteLine(shuxing.Value);//获取根元素下的所有⼦元素IEnumerable<XElement> enumerable = root.Elements();foreach (XElement item in enumerable){foreach (XElement item1 in item.Elements()){Console.WriteLine(); //输出 name name1}Console.WriteLine(item.Attribute("id").Value); //输出20}Console.ReadKey();}写⼊XML内容:static void Main(string[] args){//获取根节点对象XDocument document = new XDocument();XElement root = new XElement("School");XElement book = new XElement("BOOK");book.SetElementValue("name", "⾼等数学");book.SetElementValue("name1", "⼤学英语");root.Add(book);root.Save("d:\\123.xml");Console.ReadKey();}注:这⾥介绍的两种简单的读取写⼊xml⽂件,更多⾼级的⽤法可以参考:有道云笔记xml部分内容 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何用vc创建和读取xml文件当前Web上流行的剧本语言是以HTML为主的语言结构,HTML是一种标记语言,而不是一种编程语言,主要的标记是针对显示,而不是针对文档内容本身结构的描述的。
也就是说,机器本身是不能够解析它的内容的,所以就出现了XML语言。
XML (eXtensible Markup Language)语言是SGML语言的子集,它保留了SGML主要的使用功能,同时大大缩减了SGML的复杂性。
XML语言系统建立的目的就是使它不仅能够表示文档的内容,而且可以表示文档的结构,这样在同时能够被人类理解的同时,也能够被机器所理解。
XML要求遵循一定的严格的标准。
XML分析程序比HTML浏览器更加要挑剔语法和结构,XML要求正在创建的网页正确的使用语法和结构,而不是象HTML一样,通过浏览器推测文档中应该是什么东西来实现HTML的显示,XML使得分析程序不论在性能还是稳定性方面都更容易实现。
XML文档每次的分析结果都是一致的,不象HTML,不同的浏览器可能对同一个HTML作出不同的分析和显示。
同时因为分析程序不需要花时间重建不完整的文档,所以它们能比同类HTML能更有效地执行其任务。
它们能全力以赴地根据已经包含在文档中的那个树结构建造出相应的树来,而不用在信息流中的混合结构的基础上进行显示。
XML标准是对数据的处理应用,而不是只针对Web网页的。
任何类型的应用都可以在分析程序的上面进行建造,浏览器只是XML的一个小的组成部分。
当然,浏览仍旧极其重要,因为它为XML工作人员提供用于阅读信息的友好工具。
但对更大的项目来说它就不过是一个显示窗口。
因为XML具有严格的语法结构,所以我们甚至可以用XML来定义一个应用层的通讯协议,比如互联网开放贸易协议(Internet Open Trading Protocol)就是用XML来定义的。
从某种意义上说,以前我们用BNF范式定义的一些协议和格式从原则上说都可以用XML来定义。
实际上,如果我们有足够的耐心,我们完全可以用XML来定义一个C++语言的规范。
当然,XML允许大量HTML样式的形式自由的开发,但是它对规则的要求更加严格。
XML主要有三个要素:DTD(Document Type Declaration——文档类型声明)或XML Schema(XML大纲)、XSL(eXtensible Stylesheet Language——可扩展样式语言)和XLink(eXtensible Link Language——可扩展链接语言)。
DTD和XML大纲规定了XML文件的逻辑结构,定义了XML文件中的元素、元素的属性以及元素和元素的属性之间的关系;Namespace(名域)实现统一的XML文档数据表示以及数据的相互集成;XSL是用于规定XML文档呈现样式的语言,它使得数据与其表现形式相互独立,比如XSL能使Web浏览器改变文档的表示法,例如数据的显示顺序的变化,不需要再与服务器进行通讯。
通过改变样式表,同一个文档可以显示得更大,或者经过折叠只显示外面得一层,或者可以变为打印得格式。
而XLink将进一步扩展目前Web上已有的简单链接。
二、实现XML解析的说明当然,从理论上说,根据XML的格式定义,我们可以自己编写一个XML的语法分析器,但是实际上微软已经给我们提供了一个XML语法解析器,如果你安装了IE5.0以上版本的话,实际上你就已经安装了XML语法解析器。
可以从微软站点()下载最新的MSXML的SDK和Parser文件。
它是一个叫做MSXML.DLL的动态链接库,最新版本为msxml3,实际上它是一个COM对象库,里面封装了所有进行XML解析所需要的所有必要的对象。
因为COM是一种以二进制格式出现的和语言无关的可重用对象。
所以你可以用任何语言(比如VB,VC,DELPHI,C++ Builder甚至是剧本语言等等)对它进行调用,在你的应用中实现对XML文档的解析。
下面的关于XML文档对象模型的介绍是基于微软最新的msxml3为基础进行的。
三、XML文档对象(XML DOM)模型分析XML DOM对象提供了一个标准的方法来操作存储在XML文档中的信息,DOM应用编程接口(API)用来作为应用程序和XML文档之间的桥梁。
DOM可以认为是一个标准的结构体系用来连接文档和应用程序(也可以是剧本语言)。
MSXML解析器允许你装载和创建一个文档,收集文档的错误信息,得到和操作文档中的所有的信息和结构,并把文档保存在一个XML文件中。
DOM提供给用户一个接口来装载、到达和操作并序列化XML文档。
DOM提供了对存储在内存中的XML文档的一个完全的表示,提供了可以随机访问整个文档的方法。
DOM允许应用程序根据MSXML解析器提供的逻辑结构来操作XML文档中的信息。
利用MSXML所提供的接口来操作XML。
实际上MSXML解析器根据XML文档生成一个DOM树结构,它能够读XML文档并根据XML文档内容创建一个节点的逻辑结构,文档本身被认为是一个包含了所有其他节点的节点。
DOM使用户能够把文档看成是一个有结构的信息树,而不是简单的文本流。
这样应用程序或者是剧本即使不知道XML的语义细节也能够方便的操作该结构。
DOM包含两个关键的抽象:一个树状的层次、另一个是用来表示文档内容和结构的节点集合。
树状层次包括了所有这些节点,节点本身也可以包含其他的节点。
这样的好处是对于开发人员来说,他可以通过这个层次结构来找到并修改相应的某一个节点的信息。
DOM把节点看成是一个通常的对象,这样就有可能创建一个剧本来装载一个文档,然后遍历所有的节点,显示感兴趣的节点的信息。
注意节点可以有很多中具体的类型,比如元素、属性和文本都可以认为是一个节点。
微软的MSXML解析器读一个XML文档,然后把它的内容解析到一个抽象的信息容器中称为节点(NODES)。
这些节点代表文档的结构和内容,并允许应用程序来读和操作文档中的信息而不需要显示的知道XML的语义。
在一个文档被解析以后,它的节点能够在任何时候被浏览而不需要保持一定的顺序。
对开发人员来说,最重要的编程对象是DOMDocument。
DOMDocument对象通过暴露属性和方法来允许你浏览,查询和修改XML文档的内容和结构,每一个接下来的对象暴露自己的属性和方法,这样你就能够收集关于对象实例的信息,操作对象的值和结构,并导航到树的其他对象上去。
MSXML.DLL所包括的主要的COM接口有:(1)DOMDocumentDOMDocument对象是XML DOM的基础,你可以利用它所暴露的属性和方法来允许你浏览、查询和修改XML文档的内容和结构。
DOMDocument表示了树的顶层节点。
它实现了DOM文档的所有的基本的方法并且提供了额外的成员函数来支持XSL和XSLT。
它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到和创建。
(2)IXMLDOMNodeIXMLDOMNode是文档对象模型(DOM)中的基本的对象,元素,属性,注释,过程指令和其他的文档组件都可以认为是IXMLDOMNode,事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
(3)IXMLDOMNodeListIXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过“for...next”结构来遍历所有的节点。
(4)IXMLDOMParseErrorIXMLDOMParseError接口用来返回在解析过程中所出现的详细的信息,包括错误号,行号,字符位置和文本描述。
下面主要描述一个DOMDocument对象的创建过程,这里我们用VC描述创建一个文档对象的过程。
HRESULT hr;IXMLDomDocument* pXMLDoc;IXMLDOMNode* pXDN;Hr=CoInitialize(NULL); //COM的初始化//得到关于IXMLDOMDocument接口的指针pXMLDOC。
hr=CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPPROC_SERVER,IID_IXMLDOMDocument,(void**)&pXMLDoc);//得到关于IXMLDOMNode接口的指针pXDN。
hr=pXMLDoc->QueryInterface(IID_IXMLDOMNode,(void**)&pXDN);在MSXML解析器使用过程中,我们可以使用文档中的createElement方法来创建一个节点装载和保存XML文件。
通过load或者是loadXML方法可以从一个指定的URL来装载一个XML文档。
Load(LoadXML)方法带有两个参数:第一个参数xmlSource表示需要被解析的文档,第二个参数isSuccessful表示文档装载是否成功。
Save方法是用来把文档保存到一个指定的位置。
Save方法有一个参数destination用来表示需要保存的对象的类型,对象可以是一个文件,一个ASP Response方法,一个XML文档对象,或者是一个能够支持持久保存(persistence)的客户对象。
下面是save方法使用的一个简单的例子(具体程序请参见/swm/200101/利用MSXML解析XML文本)。
同时,在解析过程中,我们需要得到和设置解析标志。
利用不同的解析标志,我们可能以不同的方法来解析一个XML文档。
XML标准允许解析器验证或者不验证文档,允许不验证文档的解析过程跳过对外部资源的提取。
另外,你可能设置标志来表明你是否要从文档中移去多余的空格。
为了达到这个目的,DOMDocument对象暴露了下面几个属性,允许用户在运行的时候改变解析器的行为:(1)Async(相对于C++是两个方法,分别为get_async和put_async)(2)ValidateOnparse (相对于C++是两个方法,分别为get_validateOnParse和put_validateOnParse)(3)ResolveExternals(相对于C++是两个方法,分别为get_ ResolveExternals和put_ ResolveExternals)(4)PersercveWhiteSpace(相对于C++是两个方法,分别为get_ PersercveWhiteSpace和put_ PersercveWhiteSpace)每一个属性可以接受或者返回一个Boolean值。
缺省的,anync,validateOnParse,resolveExternals的值为TRUE,perserveWhiteSpace的值跟XML文档的设置有关,如果XML文档中设置了xml:space属性的话,该值为FALSE。