说明:文章中代码是我参考别人的例子得来的。

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学习的更多相关文章

  1. XML 学习介绍 收藏

    XML学习总结(一)——XML介绍 一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发 ...

  2. XML学习笔记

    XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...

  3. 第八章xml学习

    1.ASP.NET和JSP的关系 ASP.NET 和JSP都是用来开发动态网站的技术,只不过ASP.NET是通过c#语言来操作的, 而JSP是通过Java语言来操作的. 2.为什么学习XML? 01. ...

  4. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  5. XML学习笔记(1)--XML概述

    XML基本概念 XML—extensible Markup Language(可扩展标记语言) XML最基本的三个概念 1)XML语言---描述事物本身(可扩展) 2)XSL语言---展现事物表现形式 ...

  6. XML学习总结(二)——XML入门

    XML学习总结(二)——XML入门 一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(proc ...

  7. XML学习教程

    XML学习进阶1-- 什么是XML. 为什么使用 XML?... 什么是 XML?... 数据的结构表示... XML 文档... 数据是从表示和处理中分离出来的... 使XML数据自描述... XM ...

  8. Robot framework--内置库xml学习(一)

    Using lxml By default this library uses Python's standard ElementTree module for parsing XML, but it ...

  9. Java第三阶段学习(十、XML学习)

    一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...

  10. 标记语言XML

    标记语言概述 标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码.一部分是标记,一部分是标记中的内容,两部分构成标记语言   <标记 ...

随机推荐

  1. Redmine(Ruby)配置经验

    Redmine(Ruby)配置经验记录在配置Redmine邮件同步过程中遇到的各种问题与解决方法 1. 如何安装Redminehttp://www.redmine.org/projects/redmi ...

  2. validate大表单验证

    Vaidate 插件 在前端开发中, 我们会遇到大表单的验证和组合成JSON, 这是一项巨大的任务, 如果都通过 手动编写低级代码来实现 50+ input类型的验证和复杂JSON的组装, 这无疑是异 ...

  3. asp.net MVC2.0学习笔记

    asp.net;与mvc都是不可替代的:只是多一种选择:(解决了许多asp.net的许多缺点) model:充血模型.领域模型:很大程度的封装: 控制器:处理用户的交互,处理业务逻辑的调用,指定具体的 ...

  4. 后台XML处理

    public void GetInfo()     {         string message = @"<?xml version='1.0' encoding='utf-8' ...

  5. 用Haproxy给MySQL做负载均衡

    1.安装 # wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz # tar zcvf haproxy-1.4.24.t ...

  6. Dogs[HDU2822]

    Dogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...

  7. Python 用SMTP发送邮件

    一.简介 上面介绍了传统邮件的生成和解析,这些都是non-internet,也就是不需要网络就可一完成的.那么当生成了邮件,下一步就是发送了,本文就讲解利用SMTP协议发送邮件. 正如SMTP(Sim ...

  8. Makefile常用信息查询页

    这是博主第一次尝试在博客中使用markdown来写博文,目前感觉还不错.大家也可以尝试尝试. 符号说明 符号 作用   换行符 @ 放在命令前面隐藏命令输出 - 放在命令前面忽略命令错误 : 以来规则 ...

  9. 实现了一个简单的key-value存储系统

    实现了一个简单的key-value存储系统 源码下载: kvfs.rar 正文: 所谓的Key-Value就是每次存储一个数据时,是根据Key进行索引存储的.为了实现Key的快速查找功能,我使用了B- ...

  10. VS XCOPY

    有时在项目开发过程中,某个项目不直接依赖于另外一个项目,也就是说在编码上不需要使用另外一个项目上的代码,但实际运行的时候需要用到,我们通常的做法是把另外项目中需要用到的DLL拷过来放到该项目的BIN文 ...