本文参考 XML文件格式语法以及DTD,摘除其中自己认为必要的知识点,在此记录如下。

先给出一个xml的实例文件,

<?xml version="1.0" encoding="utf-8"?>
<gadget>
<name>日历</name>
<namespace>
<!--_locComment_text="{Locked}"-->microsoft.windows
</namespace>
<version>
<!--_locComment_text="{Locked}"-->1.1.0.0
</version>
<author name="Microsoft Corporation">
<info url="http://go.microsoft.com/fwlink/?LinkId=124093" text="www.gallery.microsoft.com"/>
<logo src="logo.png"/>
</author>
<copyright><!--_locComment_text="{Locked}"-->© 2009</copyright>
<description>浏览日历中的日期。</description>
<icons>
<icon height="48" width="48" src="icon.png"/>
</icons>
<hosts>
<host name="sidebar">
<autoscaleDPI><!--_locComment_text="{Locked}"-->true</autoscaleDPI>
<base type="HTML" apiVersion="1.0.0" src="calendar.html"/>
<permissions>
<!--_locComment_text="{Locked}"-->Full
</permissions>
<platform minPlatformVersion="1.0"/>
<defaultImage src="drag.png"/>
</host>
</hosts>
</gadget>

XML是一个文本文件,整个内容可以分为两个部分,分别为位于第一行的文件序言(Prolog)和文件主体。

文件序言是一个XML文件必须要声明的东西,它主要是告诉XML解析器如何工作,其中,version表示该xml文件所使用标准的版本号,encoding表示该xml文件中所使用的字符类型。

文件主体是xml文件中,除了文件序言剩下的部分,以上文为例子,它由开始的 <gadget>和结束的</gadget> 控制标记组成,它为XML的根元素;name为根元素下面的“子元素”,在子元素<author>中,name为元素的属性,后面的名字为元素的属性值。

<!-- 注释内容  --> 这一句为XML中的注释格式。

XML解析器

XML解析器首先根据XML编写规范来检查将要打开的XML文件中,是否有结构上的错误,然后剥离XML文件中的标记,读出正确的内容,交给后续程序处理。

XML的设计者严格规定了 两种XML的语法和结构,一种是 Well-Formed XML 文件,另一种是 Validating XML 文件。XML必须是Well-Formed的,只有满足这个条件,才能被解析器正确的解析出来,显示在浏览器中。以下是Well-Formed的编写准则:

1. XML文件的第一行必须是声明该文件是XML文件以及它所使用的XML规范版本。

2. XML文件中,有且只能有一个根元素

3. XML文件中,标记必须正确的关闭,有<A>,就必定对于的关闭标签 </A>。特殊的空元素写法<空元素名 [属性=“属性值”]/>

4. XML文件中,标记之间不得交叉,属性值必须用英文的””括起来, 控制标记、指令和属性名称等英文区分大小写。

5. 要想原封不动的显示输入的内容,XML中需要以CDATA来予以特殊标记,以<! [CDATA[开始标记,以>>为结束标记。

6. XML文件中,所有标记以外的空白,解析器都要忠实地交给后续应用程序来处理。

上述就是符合Well-Formed标准的XML文件,这是编写XML文件最基本的要求。XML文件是用来传输数据的,在文件中,除了数据内容之外,还有数据的元素名称,而这些元素名称是用户自定义的,这就为后续的沟通带来了问题。设想一下,A公司使用<价格>来表示,B公司使用<售价>来表示,那么他们之间的xml文件沟通,虽然都可以解析出数字来,但是所理解的意思会不同,XML的制定者约定了一个规范,编写XML文件可以用哪些标记,母元素中能够包含哪些子元素,各个元素出现的顺序,元素中的属性怎样定义等。这种约定双方的规范叫做DTD(Document Type Definiton ,文档格式定义)。可以认为DTD是编写XML的模板,照着这个模板来写,双方就能正确沟通。

如果一个XML文件时Well-Formed的,并且它是正确的依据某个DTD来建立的,那么它称之为:Validating XML文件。

DTD有两种使用方式,在XML文件中直接设定的内部DTD文件,由XML文件中调用的外部DTD文件。

内部DTD是在XML文件中的文件序言区域中定义的,语法:

<! DOCTYPE element-name[ …… ]>

<! DOCTYPE    : 表示开始设定DTD

element-name : 指定此DTD的根元素名称,如果XML文件使用了DTD,那么文件中的根元素在此指定。

[….]>             :  在[]标记里面定义了XML文件使用的元素,以>结束DTD的定义。

外部DTD是一个独立于XML文件的文件,以dtd作为文件扩展名,它可以供多个XML文件使用。下面给出一个外部DTD的例子。

〈?xml version="1.0" encoding="GB2312" ?〉
     〈!ELEMENT 参考资料 (书籍*)〉
     〈!ELEMENT 书籍 (名称,作者,价格)〉
     〈!ELEMENT 名称 (#PCDATA)〉
     〈!ELEMENT 作者 (#PCDATA)〉
     〈!ELEMENT 价格 (#PCDATA)〉
     〈!ATTLIST 价格 货币单位 CDATA #REQUIRED〉

XML文件中,使用 <!DOCTYPE element-name SYSTEM DT-URL >来引用创建好的外部DTD文件。

XML解析库

要真正在项目中使用XML,来需要自己来编写XML解析器,为了简单起见,现从学习libxml2入手,快速上手xml解析任务。这一章中,要解决的问题是解析一个xml配置文件,并将对于的内容输出到结构体中去。

这部分内容参考了 网上其他人的学习经历,点此进入。

Linux下,Gnome项目提供xml的C解析器,叫做libxml2解析库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,以及部分XSLT转换等功能。安装方法有下载源码自己编译安装或者使用apt工具来安装,建议使用后者。

安装方法: apt-get install libxml2

apt-get install libxm2-dev

安装完后,在/usr/bin里面,提供了三个与xml相关的可执行文件

xml2-config  提供了安装后的一些xml配置信息,后续编译时,需要相关信息。

xmlcatalog   不知道它用来干嘛的

xmllint         可以用来解析xml文件,并且输出解析后的结果。

libxml2里面提供了帮助编译的工具,查找xml2-config ,输出cflags和libs的配置信息

上述两个路径,需要在编译时添加到命令行中去。

编译时,产生如下的错误:

原因是没有链接库,或者链接库没有更新。添加了各种-l和-L,都不行。

正常的编译选项:

gcc test.c -o test -I/usr/include/libxml2/ -lxml2 -L/usr/lib/i386-linux-gnu/

超级大坑:gcc编译过程中,上述正常的编译就可以通过,改变一下位置,将test.c o test 放在后面,编译就失败。 

最后的执行结果如下:./test abc, 其中,abc的内容如下:

这是最后生成的xml文件。

解析XML文件,晚上再添加。

学习了解xml库,刚开始,只需要了解它最常用的几个函数和数据结构类型。下面就实例程序中提供的来一一介绍:

1. 内部字符类型 xmlChar

libxml2库中所有字符和字符串都是基于此字符类型

原型定义为 typedef unsigned char xmlChar

它能够很好适应UTF-8编码,UTF-8编码是libxml2的内部编码,其他格式的编码必须先转换为UTF-8编码才能使用libxml2。

2. xmlChar* 和其他类型之间的转换

为了便于在xmlChar* 和 char* 之间进行类型转换,定义了一个BAD_CAST宏

原型如下: #define  BAD_CAST (xmlChar *)

3. 文件类型数据结构  xmlDoc, 文件类型数据结构对于的指针 xmlDocPtr

xmlDoc保存了一个xml文件的基本信息,包括文件名、文件类型、子节点等等。

xmlDocPtr等于 xmlDoc*

xmlNewDoc 函数 用来创建一个新的文件指针

xmlParseFile 函数以默认方式读入一个UTF-8格式的文件,并返回文件指针

xmlFreeDoc  函数释放文件指针。注意,当调用此函数时,该文件所包含的节点内存都被释放,所以一般来说,不必手动调用xmlFreeNode后者xmlFreeNodeList来释放动态分配的节点内存,除非你把该节点从文件中移除。

一般来说,一个文件中的所有节点都应该是动态分配的,然后加入文件,最后调用xmlFreeDoc一次性释放所有节点申请的动态内存。

xmlSaveFile 将文件以默认方式存入一个文件

4. 节点类型 xmlNode ,节点类型对于的指针 xmlNodePtr

一个xmlNode代表XML文件中的一个节点,具体实现为一个struct,

xml文件操作的原理,就是在节点之间移动、查询节点的各项信息,并进行增加、删除、修改等操作。

5. 节点集合类型 xmlNodeSet,及其对应指针 xmlNodeSetPtr

节点集合代表一个由节点组成的变量,节点集合只作为Xpath的查询结果而出现。

实例XML文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2011 rel. 2 (http://www.altova.com) by dancelj (em) -->
<conf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="conf.xsd">
<service>
<name>service_1</name>
<monitor_interface>eth0</monitor_interface>
<exprobe_ip>192.168.8.201</exprobe_ip>
<update_period>5</update_period>
<sample_number>10</sample_number>
<media_servers>
<ip>10.0.0.1</ip>
<ip>10.0.0.2</ip>
<ip>10.0.0.3</ip>
</media_servers>
</service> <service>
<name>service_2</name>
<monitor_interface>eth1</monitor_interface>
<exprobe_ip>192.168.8.202</exprobe_ip>
<update_period>5</update_period>
<sample_number>10</sample_number>
<media_servers>
<ip>10.1.0.1</ip>
<ip>10.1.0.2</ip>
</media_servers>
</service> </conf>

先来分析以下这个xml文件,里面介绍了两个服务,每个服务都有服务名称(name),监控端口(mif),浏览ip(expip),更新周期(update_period),采样数目(sample_number)和三个媒体服务器地址,考虑到媒体服务器地址后续可能还会增加,此处采用链表形式来存储,便于后期扩展。每个服务属性也采用链表的连接起来。

Editplus快捷键:

选择当前的单词 Ctrl+W

选择当前行      Ctrl+R

新建浏览器窗口 Ctrl+Shift+B

新建普通文本   Ctrl+N

开启代码折叠    Ctrl+Shift+F

查找下一个匹配的文本 F3

查找上一个匹配的文本 Shift+F3

转到文档中指定行     Ctrl+G

ftp服务这边,主动和被动,都是针对server这端来说的。

主动连接: 客户端先告诉服务器的21号端口,我这里可以连接啦。然后服务器的20端口主动的去连接客户端的端口。

被动模式:客户端告诉服务器21号宽口可以连接啦,然后,服务器的21端口回复客户端说“我的XX端口可用,你连接过来吧”,于是客户端主动发起连接,服务器端被动接受连接,这种模式下,服务器的XX端口不再是主动模式下的20端口,而是大于1024的某个端口。

XML格式以及相关libxml库学习的更多相关文章

  1. OpenCV 学习笔记 01 安装OpenCV及相关依赖库

    本次学习是基于Window10进行的.语言为python3. 1 与opencv相关的库简介 1.1 numpy numpy 是 OpenCV 绑定 python 时所依赖的库,此意味着numpy在安 ...

  2. spring源码学习五 - xml格式配置,如何解析

    spring在注入bean的时候,可以通过bean.xml来配置,在xml文件中配置bean的属性,然后spring在refresh的时候,会去解析xml配置文件,这篇笔记,主要来记录.xml配置文件 ...

  3. thinkphp 操作xml格式

    前言:虽然xml的格式看起来跟html差不多,但是最近做项目由于用的是thinkphp5.0的版本,做的过程中还是遇到了一些问题.在这里做一下记录. 首先我们需要定义一个dom对象,我们都知道 php ...

  4. spring mvc实现Restful返回xml格式数据

    最近,想在自己的小项目中搭建一个Restful风格的服务接口api,项目用的spring mvc 3,听说spring mvc本身就能十分方便的支持restful的实现,于是查询了下资料,果然非常强大 ...

  5. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  6. C#RSA算法实现+如何将公钥为XML格式转为PEM格式,给object-C使用

    .net中,处于安全的考虑,RSACryptoServiceProvider类,解密时只有同时拥有公钥和私钥才可以.原因是公钥是公开的,会被多人持有.这样的数据传输是不安全的.C#RSA私钥加密,公钥 ...

  7. XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

    SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...

  8. Web APi入门之移除XML格式(一)

    前言 回头想来,没想到自己却坚持下来了,EntityFramework系列终于全部完成了,给自己点个赞先.本系列将着手于Web API,关于一些基础的介绍及定义就不再叙述,请参考园友们文章,非常详细, ...

  9. FusionCharts-堆栈图、xml格式、刷新数据、添加事件link、传参

    *起因* 本来想用Chart.js来搞图表的, 但是来了个新需求,想搞的华丽点,毕竟对Chart.js来说,实现有点难度, *做出的改变* 最终选择了FusionCharts, *难点* 网上关于Fu ...

随机推荐

  1. Perl多进程

    perl作为一种解释性的语言,非常受广大系统管理员的欢迎,优点么就不多说了,坏处也有不少,比如对线程的支持,就一直不咋地,所以大多数情况下,我们都须要多个进程,来帮助我们完毕工作,闲话少说,上代码. ...

  2. Web APP 随笔

    自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备). 开发者们都知道在高端智能手机 ...

  3. CAShapeLayer和CAGradientLayer

    两个动画效果来了解一下CALayer的两个重要的subClass,CAGradientLayer和CAShapeLayer. 微视录制视频的时候那个进度效果和Spark相机类似,但是个人还是比较喜欢S ...

  4. Spark之路 --- Windows Scala 开发环境安装配置

    JDK安装 JDK安装包下载 到Oracle官网下载JDK. 传送门 下载之前要记得勾选上同意协议然后选择相应的版本(Windows/Linux, 32/64) JDK安装及验证 按提示完成安装,安装 ...

  5. Linux 引导过程内幕

    转载:http://www.ibm.com/developerworks/cn/linux/l-linuxboot/index.html   从主引导记录到第一个用户空间应用程序的指导 引导 Linu ...

  6. A Simple Problem with Integers(线段树入门题)

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  7. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  8. Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换2,使用导航栏控制,以及视图之间传值。

    首先需要说明的是每个应用程序都是一个window,背景色为黑色.在window上可以跑多个view进行来回切换,下面就通过手动写代码来体现导航栏切换view的原理. 第一步,新建一个single vi ...

  9. CF Tavas and Nafas

     Tavas and Nafas time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  10. BZOJ 2962

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 618  Solved: 225[Submit][Status][Discuss] ...