浅析XML
概述XML文档结构
- 每个XML文档都分为两部分:序言(Prolog)和文档元素(或文档节点)

例子:写一段XML然后简单分析一下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE myfile [
<!ELEMENT myfile (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<myfile id="11">
<!--注释信息-->
<title>XML</title>
<author>hjk</author>
</myfile>
分析
首先前六行是XML文档的序言,包含了此文档的元数据,就是文档的基本数据
- 第一行
<?xml version="1.0" encoding="UTF-8"?>是XML文档的一个声明,有效的XML文档的第一行必须是XML文档的声明;这个格式是基本固定的前面的标签必须写成<?xml,后面version=是版本号,目前只有两个版本1.0和1.1,encoding是编码格式,不管是version还是encoding等于的内容都必须用单引号或者双引号包含。 - 第二行内部定义了XML文档的DTD,DTD就是自定义标签之间的关系。
<!ELEMENT myfile (title,author)>这个意思是myfile标签包含两个子标签title,author。<!ELEMENT title (#PCDATA)>表示title是一个PCDATA类型,PCDATA(可解析的字符数据)。
- 第一行
第七行到最后就是文档节点
<myfile>是根元素,ids是属性,下面是注释,title和author是子元素
上面没有定义处理命令,补充一下:处理指令可以用于将信息传递给应用程序。处理指令可以出现在文档任意位置的标记外部。可以出现在序言中,包括文档的类型定义(DTD),文本内容或者文档之后
处理指令的语法:
<?target instructions?>
- 意思
- target 标识指令指向哪个应用程序。
- instruction 字符,描述了应用程序要处理的信息
一个常用的处理指令的例子是通知浏览器对XML进行转换,如下所示:
<?xml-stylesheet type="text/xsl" href="appUsers.xslt" ? >
XML语法
XML文档规则
格式良好的XML文档,包含一个或多个元素,并且他们相互之间必须正确的嵌套。必须有且只有一个根元素,包含其他所有的元素。所有元素构成一个简单的层次树,所以元素与元素之间唯一的直接关系就是父子关系。
格式良好的XML文档
格式良好的XML文档不一定是有效的XML文档,有效的XML文档肯定是格式良好的XML文档
- 必须包含声明语句
<?xml version="1.0" encoding="UTF-8"?>
- 区分大小写
标签和是两个标签,不能进行匹配,,否者报错.建议同意使用大小写 - 所有XML文档必须有且只有一个根元素
- 属性值必须使用引号
- 所有标签必须有相应的结束标签
- 所有空标签必须被关闭
<title></title>
</title>
- 标签必须正确嵌套
<title><name>...</name></title> 正确
<title><name>...</title></name> 错误
XML字符引用和实体引用
字符引用
有一些字符键盘上是没有的或者是一些图形字符。所以XML文档可以使用Unicode或者十六进制数字将他们字符引用的形式加入
语句为:
©
©
代码:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<char>©</char>
<char>©</char>
</data>
效果:

实体引用
实体引用时在一个合法的XML名字前面加上一个&,后面加上一个分号
&name;
| 实体(这里面最后面应该时英文分号; | 用途 |
|---|---|
| &; | 通常用来代替& |
| <; | 通常代替< |
| >; | 通常代替> |
| &apos; | 通常代替' |
| "; | 通常代替" |
自定义实体引用
必须在文档使用前,在DTD文档中进行定义。
自定义实体定义语法:
<!DOCTYPE filename[
<!ENTITF entity-name"entity-content"
]>
例子
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE
student[
<!ELEMENT student (name,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ENTITY me "hjk">
]>
<student>
<name>&me;</name>
<sex>男</sex>
</student>
效果:可以看到&me;被赋值为hjk,这是因为上面的DTD定义的原因。

命名空间
XML命名空间提供了一种避免命名冲突的方法。
命名冲突,就是两个不同的XML文档使用同一个名字,来描述不同元素的情况。如果这两个XML文档时独立的运行的,那没有影响,但是如果恰巧一起使用,就会出现命名冲突的情况。
命名空间使用
命名空间通过给标识名称加一个网址(URL)以定位的方法来区别这些名称相同的标识。命名空间需要在XML文档开头部分声明,命名空间声明一般放置在元素的开始标记处。
语法格式
xmlns:prefix="URL"
prefix是命名空间的前缀,是可选的。
命名空间两种声明方式
- 默认声明
<?xml version="1.0" encoding="UTF-8" ?>
<student xmlns="http://www.edu.cn/xxx/xx">
<name>hjk</name>
<sex>男</sex>
</student>
我个人理解就是给student加一个唯一的标识,其实这个URL存在正确与否都不重要,只要是唯一的就行,用这个URL来区分这些标签。
- 明确声明
<?xml version="1.0" encoding="UTF-8" ?>
<h:student xmlns:h="http://www.edu.cn/xxx/xx">
<h:name>hjk</h:name>
<h:sex>男</h:sex>
</h:student>
明确声明感觉就像是取一个别名,这个元素的每一个子元素和他本身都需要用这个别名的前缀。
DTD两种声明方式
内部DTD
上面已经提到了,这里简单说一下
<!DOCTYPE myfile [
<!ELEMENT myfile (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
外部DTD
外部DTD的好处就是:它可以方便搞笑的被多个XML文档共享
外部DTA的定义和内部差不多,不在需要<!DOCTYPE>,直接写内容就可以,但是要保存成dtd文件,即文件名为name.dtd,name是文件名
外部dtd文件,文件名myfile.dtd
<!ELEMENT myfile(title,author)>
<!ELEMENT title(#PCDATA)>
<!ELEMENT author(#PCDATA)>
那么如何引用呢。引用格式为
<!DOCTYPE type-of-doc SYSTEM/PUBLIC"dtdfile-name">
实例引用上面mufile.dtd文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE myfile SYSTEM "myfile.dtd">
<myfile>
<title>XML</title>
<author>hjk</author>
</myfile>
解释说明:
- !DOCTYPE 指要定义一个DOCTYOE
- type-of-doc 指文档类型名称,由用户自己定义,通常与使用这个DTD文件XML文档根元素名称一致
- SYSTEM/PUBLIC 二选一,SYSTEM是指私有的外部DTD文件,就是自己或者合伙人写的。PUBLIC指文档调用一个公用的DTD文件,由一个权威的机构定制的,提供给特定行业或公众的DTD。
- dtdfile-name;就是存放DTD文件的地址和名称,同目录下只写名称就可以。
以上是目前所学习的理解!!
浅析XML的更多相关文章
- [转] Spring4.3.x 浅析xml配置的解析过程(6)——解析context命名空间之property-placeholder和property-override标签
在上一篇解析自定义命名空间的标签中,我们已经知道解析自定义命名空间的标签需要用到NamespaceHandler接口的实现类,并且知道spring是如何获取命名空间对应的命名空间处理器对象的.因此我们 ...
- 浅析XML和JSON的区别
前言 今天做接口对接时,发现对方竟然是通过XML进行数据传输,当时冒出的第一个想法就是:WTF,这都什么年代了,还在用XML,是来搞笑的吧,JSON它不香吗? 想法归想法,但对接还是要完成的是吧?然后 ...
- WEB安全——XML注入
浅析XML注入 认识XML DTD XML注入 XPath注入 XSL和XSLT注入 前言前段时间学习了.net,通过更改XML让连接数据库变得更方便,简单易懂,上手无压力,便对XML注入这块挺感兴趣 ...
- IOS 网络浅析-(五 xml解析)
XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量大 NSXMLPars ...
- Xml命名空间浅析
XML实例 在介绍xml命名空间之前,我们先来看段xml代码: <?xml version="1.0" encoding="UTF-8"?> < ...
- SAX解析xml浅析
SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序.使用SAX的优势在于其解析速度较快,占用内存较少(相对 ...
- jaxp实现对xml文档的增,删,改,查操作(附源码)浅析
jaxp,属于javase中的一部分.是对xml进行解析的一个工具类: 既然说到这里,还是讲全一点,讲讲上面说到的xml的解析技术. xml的一个标记型文档. 在html的层级结构中,它会在内存中分配 ...
- Android中measure过程、WRAP_CONTENT详解以及 xml布局文件解析流程浅析
转自:http://www.uml.org.cn/mobiledev/201211221.asp 今天,我着重讲解下如下三个内容: measure过程 WRAP_CONTENT.MATCH_PAREN ...
- 具体解释XML解析(一)—解析接口浅析
在DRP项目中接触到了一个XML解析工具DOM4J,它作为解析工具的据说性能很优秀.可是刚刚接触解析工具不久,而且也没有使用过其它的解析工具.因此对于DOM4J的性能没有直接的感受(没有參照物).只是 ...
随机推荐
- 浅谈php web安全
首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的we ...
- 实现redis哨兵,模拟master故障场景
由于主从架构无法实现master和slave角色的自动切换,所以在发送master节点宕机时,redis主从复制无法实现自动的故障转移,即将slave 自动提升为新的master.因此,需要配置哨兵来 ...
- Solution -「洛谷 P5236」「模板」静态仙人掌
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路. \(n,q\le10^4\),\(m\ ...
- Solution -「ROI 2019」「LOJ #3192」课桌
\(\mathcal{Description}\) Link. 原题意足够简洁啦.( \(\mathcal{Solution}\) 乍一看比较棘手,但可以从座位的安排方式入手,有结论: ...
- CentOS7搭建yum源仓库(阿里源)
文章目录 注意:环境要求 1.配置服务器端yum 1.1.安装yum源工具 1.2.配置nginx 1.2.1.配置nginx页面目录 1.3.替换yum源文件 1.4.建立yum源仓库 2.配置客户 ...
- 使用动态时间规整 (DTW) 解决时间序列相似性度量及河流上下游污染浓度相似性识别分析
时间序列相似性度量方法 时间序列相似性度量常用方法为欧氏距离ED(Euclidean distance)和动态时间规整DTW(Dynamic Time Warping).总体被分为两类: 锁步度量(l ...
- 运行EXE文件,系统提示缺少api-ms-win-crt-runtime-l1-1-0.dll,解决方法!!
api-ms-win-crt-runtime-l1-1-0.dll是一个Windows系统的应用程序拓展文件,也叫动态链接库文件.这个文件能帮助绝大多数用户解决在安装或启动部分游戏软件时出现计算机中丢 ...
- Eclipse插件拓展点
一.新建一个项目,不使用模板 二.增加"hello"拓展点 1. 打开插件描述文件的Extensions页 新建一个插件后,会自动打开插件清单文件编辑器,也可以通过META-INF ...
- C语言中左值和右值的理解
左值顾名思义等号左边,右值等号右边. 左值一般指的内存占用的一个符号: 右值指的是常量或者常量表达式: 当然左值也可以通过一些常用的运算符,例如加减乘除/&转化为右值 注意:不是所有的变量都能 ...
- 【C# 线程】interLocked锁
overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...