C语言:XML学习
说明:文章中代码是我参考别人的例子得来的。
XML基础
一、XML的概念
Xml是一种可扩展标记语言。在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。xml可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
1、Xml有以下特点:
Xml是一种标记语言,类似HTML
XML的设计宗旨是传输数据,而非显示数据
XML的标签没有被预定义。您需要自行定义标签。
XML被设计为具有自我描述性。
2、可扩展标记语言和超文本标记语言之间的差异
可扩展标记语言被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
二、XML的用途
XML仅仅是纯文本,没有任何行为。可以通俗的理解为一种带格式的文本。
XML由于它的特性常被用来简化数据的存储和共享。举如下例子:
1、XML 把数据从 HTML 分离
如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。
2、XML 简化数据共享
在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。
XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。
3、XML 简化数据传输
通过 XML,可以在不兼容的系统之间轻松地交换数据。
对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
4、XML 简化平台的变更
升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
5、XML 使您的数据更有用
由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。
不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。
三、简要的XML使用例子
例子中主要依赖libxml2库来进行对XML文档的操作。
1、创建一简易的XML文档
大致步骤如下:
(1)、建立XML文档和根节点,并将根节点绑定到XML文档
(2)、建立一个节点,设置一些属性,然后将该节点添加到根节点下
(3)、在上个节点下增加一个子节点,往子节点添加内容
(4)、重复(2)、(3)步骤增加一个节点
(5)、保存XML文档,释放相应资源
#include<string.h>
#include<stdlib.h>
#include<libxml2/libxml/tree.h>
#include<libxml2/libxml/parser.h>
#include<libxml2/libxml/xmlstring.h> int main(int argc,char **argv)
{
xmlInitParser();
//建立XML文档和根结点
xmlDocPtr doc = xmlNewDoc( "1.0");
xmlNodePtr root = xmlNewNode(NULL, "List"); //将根节点绑定到XM L文档
xmlDocSetRootElement(doc, root); //建立Person结点,为其安装四个属性
xmlNodePtr nodeTsybius = xmlNewNode(NULL, "Person");
xmlNewProp(nodeTsybius, "Id", "1001");
xmlNewProp(nodeTsybius, "Name", "Tsybius");
xmlNewProp(nodeTsybius, "Sex", "Male");
xmlNewProp(nodeTsybius, "Age", "23");
xmlAddChild(root, nodeTsybius); //在Person结点下安放子结点,并为子节点添加内容
xmlNewTextChild(nodeTsybius, NULL, "Achievement", "ABC Rank 2");
xmlNewTextChild(nodeTsybius, NULL, "Achievement", "DEF Rank 4"); xmlNodePtr nodeGalatea = xmlNewNode(NULL, "Person");
xmlNewProp(nodeGalatea, "Id", "1002");
xmlNewProp(nodeGalatea, "Name", "Galatea");
xmlNewProp(nodeGalatea, "Sex", "Female");
xmlNewProp(nodeGalatea, "Age", "21");
xmlAddChild(root, nodeGalatea); xmlNewTextChild(nodeGalatea, NULL, "Achievement", "ABC Rank 1");
xmlNewTextChild(nodeGalatea, NULL, "Achievement", "XYZ Rank 2");
xmlNewTextChild(nodeGalatea, NULL, "Achievement", "MNOP Rank 5"); //保存XML文档
int nRel = xmlSaveFile("src/List.xml", doc);
if(nRel != -1)
{
printf("List.xml: Created Successfully!\n");
} //释放资源
xmlFreeDoc(doc);
xmlCleanupParser(); return EXIT_SUCCESS;
}
2、解析上面创建的XML文档并打印其中内容
大致步骤如下:
(1)、打开XML文件并找到该XML文档的根节点
(2)、找到该根节点下的第一个子节点,找出该节点的属性并打印
(3)、遍历该节点下的带文本内容的子节点,得到文本内容并打印
(4)、转到根节点下的下一个子节点,对该节点的属性进行比较、修改和
修改该节点下的第一个内容子节点的内容
(5)、打印该节点的属性和其子节点的内容,比对是否修改成功
(6)保存XML文档,释放相应资源
#include<string.h>
#include<stdlib.h>
#include<libxml2/libxml/tree.h>
#include<libxml2/libxml/parser.h>
#include<libxml2/libxml/xmlstring.h> #define spc(level) PrintSpace(level) //输出缩进用的空格(4个)
static void PrintSpace(int level)
{
int counter;
for( counter= ; counter < level; counter++)
{
printf(" ");
}
}
//解析XML文档
//static
int main(int argc ,char** argv)
{
xmlInitParser();
//打开xml文件
xmlDocPtr doc = xmlReadFile("src/List.xml","UTF-8", XML_PARSE_NOBLANKS);
if(doc == NULL)
{
printf("Error:can't open List.xml");
exit();
} //找到首节点
xmlNodePtr root = xmlDocGetRootElement(doc);
if(root == NULL)
{
printf("Error:Can't find the root!\n");
exit();
}
//建立两个子节点
xmlNodePtr person;
xmlNodePtr achivm; spc( );
printf("Name:%s\n",root->name); person=root->children;
//逐个找出属性
spc();printf("Node:%s\n",person->name);
spc();printf("Id:%s\n",xmlGetProp(person,"Id"));
spc();printf("Name:%s\n",xmlGetProp(person,"Name"));
spc();printf("Sex:%s\n",xmlGetProp(person,"Sex"));
spc();printf("Age:%s\n",xmlGetProp(person,"Age")); //打印子节点内容
for(achivm=person->children;achivm;achivm=achivm->next)
{
spc();
printf("Node:%s\t",achivm->name);
printf("Content:%s\t",xmlNodeGetContent(achivm));
printf("End\n");
}
spc(); printf("End\n"); //一个Person结点遍历结束
//转到下一个Person结点
person = person -> next; //查看某属性是否与某字符串相等
if(xmlStrcmp(xmlGetProp(person, "Name"), (const xmlChar*)"Galatea"))
{
spc(); printf(">> The next person is Galatea!\n");
}
else
{
spc(); printf(">> The next person is not Galatea!\n");
} //查看某结点是否有某属性
if(xmlHasProp(person, "Height"))
{
spc(); printf(">> The node person has attribute: Height!\n");
}
else
{
spc(); printf(">> The next person does not have attribute: Height!\n");
} //修改属性(Attribute)
xmlSetProp(person, (const xmlChar*) "Age", (const xmlChar*) "");spc();
printf(">> Change Galatea's age from 21 to 22!\n"); //修改子结点中的内容(Content)
xmlNodeSetContent(person -> children, (const xmlChar*) "NEW Rank 1");
spc(); printf(">> Change Galatea's 1st achievement to NEW Rank 1\n"); spc();printf("Node:%s\n",person->name);
spc();printf("Id:%s\n",xmlGetProp(person,"Id"));
spc();printf("Name:%s\n",xmlGetProp(person,"Name"));
spc();printf("Sex:%s\n",xmlGetProp(person,"Sex"));
spc();printf("Age:%s\n",xmlGetProp(person,"Age")); //打印子节点内容
for(achivm=person->children;achivm;achivm=achivm->next)
{
spc();
printf("Node:%s\t",achivm->name);
printf("Content:%s\t",xmlNodeGetContent(achivm));
printf("End\n");
}
spc(); printf("End\n"); spc(); printf("End\n"); int nRel = xmlSaveFile("src/List.xml", doc);
if(nRel != -)
{
printf("List.xml: Created Successfully!\n");
}
xmlFree(achivm);
xmlFree(person);
xmlFree(root);
xmlFree(doc);
xmlCleanupParser();
return EXIT_SUCCESS;
}
说明:如果时多线程编程,xmlInitParser()与xmlCleanupParser()只能在主线程中调用
C语言:XML学习的更多相关文章
- XML 学习介绍 收藏
XML学习总结(一)——XML介绍 一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发 ...
- XML学习笔记
XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...
- 第八章xml学习
1.ASP.NET和JSP的关系 ASP.NET 和JSP都是用来开发动态网站的技术,只不过ASP.NET是通过c#语言来操作的, 而JSP是通过Java语言来操作的. 2.为什么学习XML? 01. ...
- XML学习笔记(2)--dom4j操作XML
1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...
- XML学习笔记(1)--XML概述
XML基本概念 XML—extensible Markup Language(可扩展标记语言) XML最基本的三个概念 1)XML语言---描述事物本身(可扩展) 2)XSL语言---展现事物表现形式 ...
- XML学习总结(二)——XML入门
XML学习总结(二)——XML入门 一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(proc ...
- XML学习教程
XML学习进阶1-- 什么是XML. 为什么使用 XML?... 什么是 XML?... 数据的结构表示... XML 文档... 数据是从表示和处理中分离出来的... 使XML数据自描述... XM ...
- Robot framework--内置库xml学习(一)
Using lxml By default this library uses Python's standard ElementTree module for parsing XML, but it ...
- Java第三阶段学习(十、XML学习)
一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...
- 标记语言XML
标记语言概述 标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言 <标记 ...
随机推荐
- wcf实例模型(随记)
-----------------------------------------实例模型: 1.InstanceContentextMode: -------PerCall(单调):无状态,每次调用 ...
- wcf消息模式(随记)
----------------------------------------------消息模式:1.request\reply(默认)2.one-way(单工)[Isoneway=true]客户 ...
- 支付宝集成时的InvalidKeySpecException
近来在集成第三方支付---支付宝,在集成的过程中严格按照支付宝开发者平台所发布的说明文档和Demo,在我的测试机上可以完美的运行,但是在别人的手机无论怎么就是调用不起来,总是弹出"remot ...
- 生成自己的Webapi帮助文档(二)
经过今天一上午的修改,已经有个基础的框架了,其它功能只能是在实际使用中发现一个修改一个了. 以下是生成的结果示例: 相比昨天,几个Model都有修改,这里就不一一贴代码了,放个代码包上来,有需要的自己 ...
- 基于多重信号分类算法的DOA估计
原创博文,转载请注明出处 下面的论文是我的雷达处理的作业,拿来共享,不喜勿喷.由于公式编辑器的原因,无法复制公式,全部内容请点击. 基于多重信号分类算法的DOA估计 1引言 多重信号分类(MUSIC) ...
- 【IOS开发】如何画1像素的线
最近在项目中画了一根1像素的线,我是通过直接花一个但是通过PS查看,画了不止1个像素. 原代码语句: label1 = [[UILabel alloc] initWithFrame:CGRectMak ...
- ResolveUrl in ASP.NET - The Perfect Solution
原文:ResolveUrl in ASP.NET - The Perfect Solution If you are looking for ResolveUrl outside of Page/Co ...
- C add
C++学习--应用篇(Windows/Linux)(书籍推荐及分享) 我将以平台划分,分别介绍Windows和Linux下个人认为的好书(与基础篇一样,大部分网络上都有电子版): 对于C++基础类的图 ...
- C# 获取Get请求返回
/// <summary> /// 远程获取页面数据 /// </summary> /// <param name="Url">地址</p ...
- 《12个有趣的C语言问答》评析2
<12个有趣的C语言问答>评析(2) 前文链接:http://www.cnblogs.com/pmer/p/3313913.html (没存盘,遭遇过热保护.至少4个问答的评论白写了.默哀 ...