本文参考 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. delphi 带历史信息的菜单

    带历史信息的菜单 实例说明 在有些软件中,菜单栏中可以记录已经打开过的文件信息,使用户操作简单.快捷.当用户要打开已打开过的文件时,不需要重复查找,只需选择菜单中打开过的文件,即可实现打开该文件的操作 ...

  2. php中数组自定义排序

    php中数组自定义排序方法有很多,现在只提usort();不会保留原有键名. unsort调用方法就是unsrot($arr,func); 注意: 如果func是写在当前类中的话,那么调用的方式是 u ...

  3. C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  4. Oralce_语法

    Oracle内建数据类型 一. 字符数据 1. char(size) 2. varchar2(size) 最常用,最大长度4000字节 3. nvhar(size).nvarchar(size) 4. ...

  5. 更改gps.conf来加快GPS搜星速度

    国内NTP ServerNTP全称是Network Time Protocol,是用来让计算机之间实现时间同步的协议,而发布这种校对时间的服务器,就是NTP Server!一般来说客户端与服务器之间的 ...

  6. Helpers\Request

    Helpers\Request The Helpers\Request class is used for detecting the type of request and retrieving t ...

  7. Linux 引导过程内幕

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

  8. 使用GPS经纬度定位附近地点(某一点范围内查询)

    需要手机查找附近N米以内的商户,致想法是已知一个中心点,一个半径,求圆包含于圆抛物线里所有的点,经纬度是一个点,半径是一个距离,不能直接加减,下面提供C#的解决方法 数据库中记录了商家在百度标注的经纬 ...

  9. css笔记15:盒子模型

    1.流 流:html元素在网页中显示的顺序 标准流:在html文件中,写在前面的元素在前面显示,写在后面的html元素在后面显示. 非标准流:在html之中,当某个元素脱离了标准流,那么它处于非标准流 ...

  10. Java中的文件操作

    在使用计算机编程中,常常会用到对于文件的操作,以下是我对于Java中文件的相关内容学习之后的一个总结和在学习过程中遇到的一些问题. 一.什么是文件 对于文件进行操作,首先我们要知道什么是文件.在此之前 ...