XML及其解析
XML及其解析
勤劳的开发者px 发表于1个月前
XML及其解析
  • 发表于 1个月前
  • 阅读 4
  • 收藏 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());
      }

       

共有 人打赏支持
粉丝 0
博文 30
码字总数 53910
评论 (0)
×
勤劳的开发者px
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: