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)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言 <标记 ...
随机推荐
- 使用response实现文件下载功能
response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("u ...
- GIT+云盘作 做 文档管理工具
GIT+云盘作 做 文档管理工具 在工作中, 会遇到公司的文档 和 自己家里的 文档进行同步的问题, 通常我们使用U盘作为传输节制, 但是不是非常好,文档的改动都不能发现, 导致回家同步的时候, 出各 ...
- 学习GDI+ (1)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- TeamCity vs Jenkins: Which is the Better Continuous Integration (CI) Server for .NET Software Development?
原文:http://www.excella.com/insights/teamcity-vs-jenkins-better-continuous-integration-server So, you’ ...
- LaTex代码生成器
latex代码生成器 希腊字母 \alpha \beta \gamma \delta \epsilon \zeta \eta \theta \iota \kappa \lambda \mu \nu \ ...
- [转]A Faster UIWebView Communication Mechanism
ref:http://blog.persistent.info/2013/10/a-faster-uiwebview-communication.html Use location.hash or t ...
- linux 之 popen函数
描述 popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也 ...
- AngularJS框架研究(一)
和几年前相比,现在的Javascript开发方式有了翻天覆地的变化,一些极具创意的开发工具的出现,让前端开发更加成熟,Angular框架就是一个例子.最近在看Angular的源代码,发现并不是件容易的 ...
- linux网络编程(一)
一.概念介绍 网络程序分为服务端程序和客户端程序.服务端即提供服务的一方,客户端为请求服务的一方.但实际情况是有些程序的客户端.服务器端角色不是这么明显,即互为客户端和服务端. 我们编写网络程序时,一 ...
- C#:.net/方法/字符串/数组
C#:.net/方法/字符串/数组,那点事 首先还是先说下(几个概念的东西)c#下的.net平台的构造快及其功能作用和程序集: .net: .net平台是由:a:运行库+b:全面基础类库(这个是从程序 ...