XML

1.XML概述

XML可扩展标记语言是一种基于文本的语言用作应用程序之间的通信模式,是一个非常有用的描述结构化信息的技术。XML工具使得转化和处理数据变得十分容易,但同样也要领域相关的标准和代码库才能有效的使用XML,而JAVA则提供了极好的支持和丰富的库来解析、修改以及查询XML文档。

如果你已经学习过了XML,那么你就会发现,XML的语法和HTML的语法十分类似,两者的不同之处在于:XML的标签并不是预先定义好的,而是可以自定义标签,这也是它被称作可扩展标记语言的原因,应当注意的是,自定义的XML标签应当像JAVA中定义变量那样,见名知意。

XML可以用于任何技术进行数据的存储和传输。不过,XML同样拥有很明显的缺点,那就是内容比较冗杂。

下面是一个XML的栗子(表示字体以及字号):

  1. <configuration>
  2. <title>
  3. <font>
  4. <name>Helvetica</name>
  5. <size>35</size>
  6. </font>
  7. </title>
  8. <body>
  9. <font>
  10. <name>times roman</name>
  11. <size>16</size>
  12. </font>
  13. </body>
  14. </configuration>

2.XML文档的结构

  • XML文档拥有一个文档头:
  1. <?xml version="1.0" encoding="utf-8">

虽说文档头是可选的,但是最好要将文档头写在XML文档中。

  • 文档头之后是文档类型定义:
  1. <!DOCTYPE web-app PUBLIC ....>

文档类型的作用是用来保护文档,但不是必须的。

  • 最后是文档的正文,包含根元素,根元又素包括其他元素
  1. <title>
  2. <font>
  3. <name>Helvetica</name>
  4. <size>35</size>
  5. </font>
  6. </title>
  7. <body>
  8. <font>
  9. <name>times roman</name>
  10. <size>16</size>
  11. </font>
  12. </body>

元素可以有子元素、文本元素,或者两者皆有。如下:

  1. <font>
  2. Helevetia
  3. <size>35</size>
  4. </font>

但最好规避使用两者皆有的情况,这样做的好处是可以简化解析过程,后面我们就会见到这种情况。

XMl元素还可以包含属性,如:

  1. <font name="Helevetia" size="36 pt"></font>

貌似你会觉得这种用法会比下面的用法简单一些:

  1. <font>
  2. <name>Helevetia</name>
  3. <size>36</size>
  4. </font>

但是,如果按照第一种做法,解析的时候会增加解析的难度,因为我们要解析的是“36 pt”而不是36。

为了避免这种麻烦,我们采取下面这样的做法:

  1. <font>
  2. <name>Helevetia</name>
  3. <size unit="pt">36</szie>
  4. </font>

这样会简单很多,如果不明白,不用着急,接下来我们可以仔细体会。另外,我们常用的经验是,属性只应该作为值的解释,而不应该作为值。

3.解析XML文档

要处理一个XML文档,就要对它进行解析。解析器首先读入一个文件,确认这个文件拥有正确的格式,然后将其分解成各种元素,然后程序就能够访问这些元素了。

JAVA库中有两种XML解析器:

  • 树形解析器(DOM):将读入的XML文档转换成树形结构
  • 流机制解析器(SAX):读入XML文件时生成对应的事件

我们首先介绍DOM的使用,因为这种方式能够满足我们大多数的需求:

  1. DOM使用方式

    • 创建一个DocumentBuilder对象
  1. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  2. DocumentBuilder builder = factory.newDocumentBuilder();
  • 从文件中读入文档
  1. File f = ...
  2. Document doc = builder.prase(f);
  1. 具体方法

    • getDocumentElement:启动对文档内容的分析,返回根元素
  1. Element root = doc.getDocumentElement;
  • getTagName:返回标签名称
  • getChildNodes:得到元素的子元素,返回NodeList集合
  1. NodeList children = root.getChildNodes();

如需遍历所有子元素,会用的上getLength方法获取总项数

  • getFirstChild:获取该节点的第一个子节点
  • getLastChild:获取该节点的最后一个节点

以上两个方法在没有获取到值的时候返回null

  • getNextSibling:获取该节点的下一个兄弟节点
  • getPreviousSibling:获取该节点的上一个兄弟节点
  • getParentNode:获取父节点
  • getNodeName:返回该节点的名字
  • getNodeValue:返回该节点的值

3.验证XML文档

使用DOM方式来操作XML文档时,会有大量的编程和错误检查,不但需要处理文档中的空白字符,还要检查是否与预期的一样。但是,XML能够自动校验某个XML文档是否具有正确的结构。

我们也可以自己指定文档的结构,可以使用文档类型定义以及XML Schema定义,这就相当于一种规则,指定了每个元素的合法元素和属性。例如下面这个文档类型定义:

  1. <!ELEMENT font(name,size)>

这个定义规定了font元素必须有两个子元素。

值得注意的是,XML Schema能表达更加复杂的验证条件。

  1. 文档类型定义

    • 将定义纳入XML文档

      1. <?xml version="1.0"?>
      2. <!DOCTYPE configuration[
      3. <!ELEMNET configuration...>
      4. >

    这是一个文档类型定义的写法。

    我们将规则使用[]作为规范的限定,文档类型必须匹配根节点的名称!这里的缺点很明显,一旦规则很多,那么就会使得[]变得十分庞大。

    • 不同类型的规则

      • ELEMENT:指定某个元素可以拥有什么样子的子元素

        1. <!ELEMENT document (title,(introduce...))>

      当一个元素中存在文本时,只有两种情况是合法的。一种是只包含文本,另一种是包含任意顺序的文本和标签的组合,其他情况均不合法。

    有了文档类型的定义,调用方法来解析XML文件的时候,就不必再考虑如何消除文本的空白字符问题了。

  2. XML Schema

    如果希望在XML中使用Schema,就需要在根元素中添加属性:

    1. <xsd:element name="font">
    2. <xsd:sequence>
    3. <xsd:element name="name" type="xsd:String"/>
    4. <xsd:element name="size" type="xsd:int">
    5. </xsd:sequence>
    6. </xsd:element>

4.使用XPath定位信息

我们如果想定位下面这段XMl文件中的size值,使用遍历当然可以,但是非常麻烦,我们可以直接使用XPath表达式来进行定位。

  1. <font>
  2. <name>Helevetia</name>
  3. <size>36</size>
  4. </font>

表达式为:/font/size 这样就可以得到size的值了。

具体内容参考JAVA核心技术卷2.

5.使用命名空间

命名空间的主要作用就是避免名字冲突,这种做法在JAVA中十分常见

  1. <xsd:element name="font">
  2. <xsd:sequence>
  3. <xsd:element name="name" type="xsd:String"/>
  4. <xsd:element name="size" type="xsd:int">
  5. </xsd:sequence>
  6. </xsd:element>

这里的xsd就是一种命名空间。

6.流机制解析

流机制解析器主要应用在:文档很大,处理算法简单,可以在运行时解析结点,不必看到完整的解析树。

  1. 使用SAX解析器

XML是基于事件的解析器,在解析XML文档时不会创建解析树。

观察第4节中的内容,解析器在解析时会产生下面的调用:

  1. (1) startElement 元素名:font
  2. (2) startElement 元素名:name
  3. (3) characters 内容:Helevetia
  4. (4) endElement 元素名:name
  5. (5) startElement 元素名:size
  6. (6) characters 内容:36
  7. (7) endElement 元素名:size
  8. (8) endElement 元素名:font

2.使用StAX解析器

StAX是一种“拉解析器”,我们只需要使用最基本的循环就可以迭代出所有的事件

利用java库中的一些方法就可以实现这些操作,请参阅javaAPI

7.生成XML文档

我们可以使用文档内容来构建一棵DOM树,然后写出树中的所有内容。

  1. 不带命名空间的文档

首先得到一个空白的文档:

  1. Document doc = builder.newDocment();

使用Document类的createElement方法构建文档元素:

  1. Element rootElement = doc.createElement(rootName);

还可以使用createTextNode创建文本节点:

  1. Text textNode = doc.createTextNode(text);

以及其他的一些操作。

2.带命名空间的文档

带命名空间文档与没有命名空间文档的生成区别在于:需要将生成器工厂设置成命名空间敏感的,然后再创建生成器。

生成节点的方法是createElementNS来创建所有的节点

创建完成后,我们就可以写出文档了。

本文参考:

  1. JAVA核心技术卷2xml

感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

微信公众号:进击的程序狗

邮箱:roobtyan@outlook.com

个人博客:https://roobtyan.github.io

XML技术详解的更多相关文章

  1. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  2. Comet技术详解:基于HTTP长连接的Web端实时通信技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  3. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  4. Protocol Buffer技术详解(语言规范)

    Protocol Buffer技术详解(语言规范) 该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的 ...

  5. CDN学习笔记二(技术详解)

    一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...

  6. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

  7. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

  8. XML文件详解以及解析

    转自:https://blog.csdn.net/com_ma/article/details/73277535 一.xml基础详解: 1.概述: xml:即可扩展标记语言,xml是互联网数据传输的重 ...

  9. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

随机推荐

  1. Setup Factory删除TODO文件

    s1= Shell.GetFolder(SHF_STARTMENUPROGRAMS);s2 = String.Concat(s1, "\\*\\TODO");//将*替换成项目名F ...

  2. Photoshop 更换证件照底色

    1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中.  3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...

  3. 034-PHP简单定义一个匿名函数

    <?php /* 简单定义一个匿名函数 */ # 把匿名函数赋值给一个变量,也叫临时函数 $demo = function ($txt) { echo $txt; }; # 调用测试下 $dem ...

  4. HZNU-ACM寒假集训Day11小结 贪心

    1.刘汝佳紫书区间问题三大情况 1.选择不相交区间 贪心策略:一定要选择第一个区间 2.区间选点问题 贪心策略:取最后一个点 3.区间覆盖问题: n个闭区间,选择尽量少的区间覆盖一条指定线段[s,t] ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-tags

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. Vuex基本介绍

    1.什么是Vuex Vuex是一个专为vue.js应用程序开发的状态管理模式. 状态管理:data里面的变量都是vue的状态. 2.为什么要用Vuex 当我们构建一个中大型的单页面应用程序时,Vuex ...

  7. Adobe Photoshop CC2014 for MAC 详细破解步骤

    1,安装Adobe Photoshop CC2014 for MAC,可以断网安装,如果不断网的话,需要申请一个Adobe ID,是免费申请. 2,下载破解工具,https://sdifen.ctfi ...

  8. POJ 1276:Cash Machine 多重背包

    Cash Machine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30006   Accepted: 10811 De ...

  9. java登录以及连接数据库的温习

    学完一部分android相关知识点后,为了下周的java测试,我还是反回来重新的学习了上学期的知识点java,在今天打开eclipse之后,对于自己之前自己所写过的东西还有连接数据库的内容,已经有所忘 ...

  10. 大数据高可用集群环境安装与配置(06)——安装Hadoop高可用集群

    下载Hadoop安装包 登录 https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ 镜像站,找到我们要安装的版本,点击进去复制下载链接 ...