文档章节

XML及其解析

勤劳的开发者px
 勤劳的开发者px
发布于 2017/09/10 11:50
字数 1822
阅读 8
收藏 0

1、什么是xml

全称EXtensible Markup Language ,即可扩展标记语言 。在设计之初,用来替代HTML,并可以传输和存储数据 ,目前主要用于框架的配置文件 ,XML标签没有被预定义,需要用户自行定义标签 。

2、xml语法

书写规范

  1. 所有XML元素都须有闭合标签
  2. XML标签对大小写敏感
  3. 标签必须正确的嵌套
  4. 一个XML文档有且仅有一个根标签
  5. 属性值必须使用引号引起来
  6. 标签名不能以xml(不管是大写还是小写)开头

XML文档的组成

声明:

<?xml version="1.0" encoding="utf-8"?>
  1. 作用: 声明本文件是一个XML文件
  2. 必须出现在第一行第一列
  3. 必须以<?xml 开头 以?>结束
  4. 文档声明常见的两个属性: version="1.0"指定文档版本    encoding="utf-8"指定当前文档的编码

元素:

  1. 普通元素的结构由开始标签,元素体,结束标签组成;例如:<hello>你好</hello>
  2. 元素体:可以是元素也可以是文本
  3. 空元素:只有开始标签,没有结束标签,元素必须自己闭合;
  4. 元素命名:区分大小写;不能使用空格;不能使用冒号;不建议以xml开头;
  5. 标签体中的空格/换行/制表符都是有意义的 

属性:

  1. 和HTML标签的属性一样,直接写在标签中.需要注意的是,属性值需要用引号引起来
  2. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头

注释:

     和HTML一样<!-- -->.在Eclipse中的快捷键是: Ctrl + Shift + /

转义CDATA:<![CDATA[   任意内容  ] ]>

  1. 全称 : Character Data,因为很多符号已经被xml文档结构所使用,所以在元素体或属性值中想使用这些符号就必修进行转义,例如:<  、> 、 ’ 、" 、 & 
  2. 作用 : 如果要输出的内容中包含标签,可以使用CDATA区. 例如下面代码中的<html>会被作为普通文本内容解析<![CDATA[我会<html>]]>

3、xml约束

约束的作用 : 规范XML文件的书写(文档中能用哪些标签、哪些属性,以及顺序等)

常见的约束

  1. DTD
  2. Schema

DTD约束

全称:Document Type Definition,文档类型定义

常用语法

  • 元素声明

  1. 语法1 : <!ELEMENT 元素名称 (元素内容)>
  2. 示例1 : <!ELEMENT servlet-mapping (servlet-name,url-pattern) >
  3. 语法2 : <!ELEMENT 元素名称 类别>
  4. 示例2 : <!ELEMENT servlet-name (#PCDATA)>
  • 属性声明

  1. 语法 : <!ATTLIST 元素名称 属性名称 属性类型 默认值>
  2. 示例 : <!ATTLIST web-app version CDATA #IMPLIED> #IMPLIED表示该属性可选,#REQUIRED表示该属性必选
  • 特殊符号

  1. 星号*出现任意次数
  2. 问号?出现0次或1次
  3. 加号+出现至少一次
  4. 逗号,代表顺序
  5. 竖线|代表或者
  6. 括号()代表分组
  • DTD文件和XML文件的关联方式

    • 内部关联 :

      1. DTD和XML写在同一个文件中

      2. 语法 : <!DOCTYPE web-app [约束内容]>

    • 外部关联_系统关联

      • DTD和XML分别为一个文件.但是都在本地

      • 语法 : <!DOCTYPE 根标签名 SYSTEM "DTD文件的本地路径" >

    • 外部关联_公共关联

      • DTD和XML分别为一个文件.但是DTD文件在网络上

      • 语法 : <!DOCTYPE 根标签名 PUBLIC "DTD名称" "DTD的URL">

  • 开发中如何关联

    • 打开DTD约束文件,查找文件顶部以<!DOCTYPE开头的声明

    • 将这一段声明拷贝到自己的XML文件中

    • 如果使用外部公共关联方式,但是电脑没有联网,需要手动将其修改为外部系统关联

 

Schema约束

特点 : 比DTD更加强大,约束力更强,而且可以引入多个约束文件

开发中如何关联

  • 找到约束文件中声明的根标签

  • 在新建的xml文件中创建该根标签

  • 在根标签的开始标签中按Alt + / ,选择xsinp,该字段用于声明本文档受Schema的约束

  • 在根标签的开始标签中按Alt + / ,选择default namespace,该字段的值=约束文件顶部的约束声明中targetNamespace字段的值

  • 在根标签的开始标签中按Alt + / ,选择schemaLoc,{namespace}字段的值=约束文件顶部的约束声明中targetNamespace字段的值, {location}字段的值=约束文件的路径.两个字段之间要有空格</font>

    <web-app xmlns="http://www.example.org/web-app_2_5" 
    		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    		xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
    		version="2.5">

     

5、xml解析

 常见的解析方式:

1、DOM:要求解析器把整个xml文档装载到内存,并解析成一个Document对象。

        优点:元素与元素之间保留结构关系,可以进行增删改查操作。

         缺点:xml文档过大,可能出现内存溢出现象。

2、SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。

        优点:处理速度快,可以处理大文件

        缺点:只能读,逐行后将释放资源

3、PULL:Android内置的xml解析方式,类似SAX。

常见的解析开发包:

  • JASP : Sun官方提供,同时支持DOM和SAX

  • jsoup : 处理的HTML解析器

  • JDOM : dom4j的兄弟

  • dom4j : 应用广泛,例如Hibernate

 

dom4j解析

  • 主页 : dom4j

  • 使用步骤

    1. 新建工程,导入DOM4J的jar包.如果是普通Java工程,需要手动Build Path

    2. 创建解析器SAXReader

    3. 加载文档,获取Document对象

    4. 通过Document对象获取文档的根节点

    5. 通过根节点获取所有子节点

    6. 遍历所有节点

      public static void main(String[] args) throws Exception {
      		// 1.创建解析器
      		SAXReader saxReader = new SAXReader();
      		InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");
      		// 2.读取文档
      		Document document = saxReader.read(is);
      		// 3.获取根节点
      		Element rootElement = document.getRootElement();
      		// 4.获取所有子节点
      		List<Element> elements = rootElement.elements();
      		// 5.遍历所有子节点
      		for (Element element : elements) {
      			// 获取标签的名字
      			String name = element.getName();
      			// 获取标签中的值
      			String text = element.getText();
      			System.out.println(name + "===" + text);
      		}
      	}
      
      	// 递归,获取所有节点的name和值
      	public static void iterate(Element rootElement) {
      		if (rootElement == null) {
      			return;
      		}
      		// 获取所有子节点
      		List<Element> elements = rootElement.elements();
      		// 遍历
      		for (Element element : elements) {
      			String name = element.getName();
      			String text = element.getTextTrim();
      			System.out.println(name + "===" + text);
      			// 递归调用
      			iterate(element);
      		}
      	}

       

XPath的使用

  • 如果XML文档比较复杂,使用DOM4J查找节点的时候会非常麻烦,这时可以使用XPath快速定位节点

  • 使用步骤

    1. 新建工程,导入dom4j和jaxen两个jar包.如果是普通Java工程,需要手动Build Path

    2. 创建解析器SAXReader

    3. 加载文档,获取Document对象

    4. 通过Document对象的selectNodes()和selectSingleNode()方法查找对应的节点

      public void testXpath() throws Exception {
      	// 1.创建解析器
      	SAXReader saxReader = new SAXReader();
      	InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");
      	// 2.加载文档
      	Document document = saxReader.read(is);
      	// 3.通过XPath语法查找所有名字为servlet-class的节点
      	List<Node> list = document.selectNodes("//servlet-class");
      	// 4.遍历
      	for (Node node : list) {
      		// 因为已经知道servlet-class为元素,所以强制转换为Element
      		Element element = (Element) node;
      		String text = element.getText();
      		System.out.println(text);
      	}
      }
      
      public void testXpath2() throws Exception {
      	// 1.创建解析器
      	SAXReader saxReader = new SAXReader();
      	InputStream is = DOM4JTest.class.getClassLoader().getResourceAsStream("web.xml");
      	// 2.加载文档
      	Document document = saxReader.read(is);
      	// 3.通过XPath语法查找web-app节点中,第一个servlet节点中的servlet-class节点
      	Element element = (Element) document.selectSingleNode("/web-app/servlet[1]/servlet-class");
      	System.out.println(element.getText());
      }

       

© 著作权归作者所有

共有 人打赏支持
上一篇: Servlet
下一篇: ActiveMQ消息队列
勤劳的开发者px
粉丝 3
博文 54
码字总数 108225
作品 0
荆州
程序员
私信 提问
XML和Json使用

1.XML与JSON的区别比较 XML定义:扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标...

微尘鉴
2016/02/23
29
0
Java XML 解析器--FastXml

FastXml是一个简单、高性能、极少内存消耗的基于xml pull机制的java xml解析器。 性能最好的xml解析器:性能是VTD-XMl的3倍,是XPP3/MXP1的2倍,详见性能测试数据和测试代码 几乎不消耗额外的...

匿名
2016/08/08
974
1
Mod_Security: Processing Phase

1. Processing Phase Phase:Apache的5个处理阶段。 Request Header(phase:1):处理 requesst line 和 request headers Request Body(phase:2):处理 request body Response Header(pha......

捞小虾
2017/12/13
0
0
谈谈程序开发中,关于“零配置”和“有配置”的看法

本人是做Java开发的,在程序开发中会经常使用到OpenSource开源框架,这些框架大多都灵活、简单、易用、方便。而且开源框架一般会提供一些基本的配置,如我们常用的框架就有Hibernate要配置对...

ibm_hoojo
2012/10/31
0
0
springmvc学习笔记(1)-框架原理和入门配置

springmvc学习笔记(1)-框架原理和入门配置 标签: springmvc [TOC] 本文主要介绍springmvc的框架原理,并通过一个入门程序展示环境搭建,配置以及部署调试。 springmvc是spring框架的一个模块...

brianway
2016/03/08
271
0

没有更多内容

加载失败,请刷新页面

加载更多

Eos如何删除钱包

在使用Eos的keosd钱包软件时,如果要删除EOS中指定名称的钱包,最简单的办法是直接删除钱包文件,不过在删除钱包之前,需要先停止钱包软件的运行。 学习EOS应用开发要选这个:【EOS智能合约与...

geek12345
6分钟前
0
0
js操作时间

获取当前时间 function getSystemDate(){ var systemDate = new Date(); // 获取当年 var year = systemDate.getFullYear(); // 获取当月 (月+1是因为js中......

简心
13分钟前
0
0
区块链开发教程推荐

区块链的重要性已经毋庸置疑,但对大多数跃跃欲试的开发者而言,去中心化思想、非对称加密、共识算法等技术点的理解和运用,都是入门区块链开发的挑战。合适的区块链开发教程可以极大地缩短区...

笔阁
13分钟前
0
0
菜单menuView总结

1、FTPopOverMenu

_____1____
24分钟前
2
0
MyEclipse教程:Web开发——部署和测试Web项目

MyEclipse 在线订购年终抄底促销!火爆开抢>> MyEclipse最新版下载 本教程向用户展示了使用关联的Web项目创建Web片段项目的机制。用户还可以获得要检查的示例项目。在本教程中,用户将学习如...

电池盒
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部