文档章节

XML及其解析

勤劳的开发者px
 勤劳的开发者px
发布于 2017/09/10 11:50
字数 1822
阅读 7
收藏 0
点赞 0
评论 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());
      }

       

© 著作权归作者所有

共有 人打赏支持
勤劳的开发者px
粉丝 2
博文 51
码字总数 108225
作品 0
荆州
程序员
XML知识小结

1.XML有如下应用: 1_存储数据,即在没有数据库的情况下,是一个很好的替代品; 2_传输数据,即服务器以XML的形式向android发送数据 3_软件配置,即通用配置XML文件,通知应用程序如何处理业...

催呀催呀 ⋅ 2015/07/30 ⋅ 0

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

SAX之安装SAX

Java中关于操作XML两大核心API库是:SAX(Simple API for XML)与 DOM。这里我们先讲SAX。SAX使得程序员可以在XML解析事件发生时进行编程,SAX库中提供的接口将成为程序员XML编程工具箱中的重...

柳哥 ⋅ 2015/01/13 ⋅ 0

Java XML 解析器--FastXml

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

匿名 ⋅ 2016/08/08 ⋅ 1

XML和Json使用

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

微尘鉴 ⋅ 2016/02/23 ⋅ 0

快速解析XML

SAX解析XML文件采用事件驱动的方式进行,也就是说,SAX是逐行扫描文件,遇到符合条件的设定条件后就会触发特定的事件,回调你写好的事件处理程序。使用SAX的优势在于其解析速度较快,相对于D...

小湘西 ⋅ 2015/11/19 ⋅ 2

Android利用SAX解析XML文件

在 Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的PULL解析器。其中SAX是一个解析速度非常快并且占用内存少的XML解析器,非...

鉴客 ⋅ 2011/12/12 ⋅ 3

最简单的XML用法

在传递数据时,XML和JSON是最常用的数据格式,SQL Server从很早的版本就开始支持XML格式,而对于JSON格式,SQL Server从2016版本开始支持。大多数数据库系统并没有升级到SQL Server 2016版本...

长征6号 ⋅ 2016/11/27 ⋅ 0

谈谈程序开发中,关于“零配置”和“有配置”的看法

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

ibm_hoojo ⋅ 2012/10/31 ⋅ 0

springmvc学习笔记(1)-框架原理和入门配置

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

brianway ⋅ 2016/03/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 6分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 9分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 13分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 17分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 19分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 20分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 23分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 26分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 26分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 27分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部