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)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言 <标记 ...
随机推荐
- Linux下查看MySQL的安装路径
Linux下查看mysql.apache是否安装,并卸载. 指令 ps -ef|grep mysql 得出结果 root ? :: /bin/sh /usr/ ...
- TodoList开发笔记 – Part Ⅳ
跌跌撞撞总算是把客户端开发好了,后台的代码因为不复杂,就写了些单元测试跑一跑就算通过了,大部分时间都是在调整脚本. 这一节开始部署TodoList项目. 一.了解IIS(Internet Infoma ...
- 增强型for语句与java,c#的不同之处,with语句的使用
<script type="text/javascript" language="javascript"> //遍历数组 var arr = [&q ...
- Fitnesse集成TestLink
TestLink作为开源测试管理工具,可以进行测试工程.测试计划以及执行计划的管理,而且TestLink团队提供了XML-PRC的接口供第三方工具调用,接口支持程度也比较好. Fitnesse作为开源 ...
- Maven-01 安装maven
maven是apache的一个开源项目.用于管理java项目的构建等.
- GoLang获取struct的tag
GoLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码能清楚的看懂! package main import ( &q ...
- facebook .net sdk 应用
浅谈 facebook .net sdk 应用 今天看了一篇非常好的文章,就放在这里与大家分享一下,顺便也给自己留一份.这段时间一直在学习MVC,另外如果大家有什么好的建议或者学习的地方,也请告知 ...
- IIS 7.5配置PHP站点
准备工作 首先下载并解压PHP程序文件,比如解压到C:/PHP/,不需要安装.IIS安装略. 第一步:添加ISAPI筛选器和CGI功能 控制面板—>程序和功能—>打开或关闭Windows功 ...
- 理解对象模型图(Reading OMDS)
理解对象模型图(Reading OMDS) 引言 这篇文章大部分内容是翻译的帮助资料里的东西.学习技术,英语是个好工具.一直把英语的地位看得和技术一样重,也会强迫自己看英语版的技术书籍(都是PDF版的 ...
- 【C基础】const用法
1.const 和 define 异同 同:const 和 define都是修饰常量 异:const修饰的常量只是编译器的一种优化,它是可以通过内存地址修改const修饰的常量:而define修饰的常 ...