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)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言 <标记 ...
随机推荐
- JS判断鼠标向上滚动还是向下滚动
js如何判断滚轮的上下滚动,我们应该都见到过这种效果,用鼠标滚轮实现某个表单内的数字向上滚动就增加,向下滚动就减少的操作,这种效果是通过js对鼠标滚轮的事件监听来实现的.今天简单的研究了一下如何使用j ...
- hexo github
win 安装nodejs,用nodejs cmd执行 npm install -g hexo hexo init blog cd blog npm install 或者新建文件夹,进去init再npm ...
- MVC4中使用Ninject
MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册 Global.asax.cs RegisterNinje ...
- [Usaco2007 Jan]Telephone Lines架设电话线[二分答案+最短路思想]
Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...
- 初试KONCKOUT+WEBAPI简单实现增删改查
初试KONCKOUT+WEBAPI简单实现增删改查 前言 konckout.js本人也是刚刚接触,也是初学,本文的目的是使用ko和asp.net mvc4 webapi来实现一个简单增删改查操作.Kn ...
- 在html中使用javascript显示本地图片的
<html> <head> <script type="text/javascript"> function getFullPath(obj){ ...
- CSS border-radius 圆角
本文转自:http://www.kwstu.com/Admin/ViewArticle/201409151549476225 border-radius属性主要用于设置div圆角效果. 使用方法 bo ...
- C#中字符转换问题详解
C# 出来也有些日子了,最近由于编程的需要,对 C# 的类型转换做了一些研究,其内容涉及 C# 的装箱/拆箱/别名.数值类型间相互转换.字符的 ASCII 码和 Unicode 码.数值字符串和数值之 ...
- 简单好用的Adapter---ArrayAdapter
简单好用的Adapter---ArrayAdapter 拖延症最可怕的地方就是:就算自己这边没有拖延,但对方也会拖延,进而导致自己这边也开始拖延起来!现在这个项目我这边已经是完工了,但是对方迟迟没有搞 ...
- mosquitto MQTT message broker on ubuntu/debian built from source
what is mosquitto? check this out! http://mosquitto.org what is MQTT? check this out. http://mqtt.or ...