1.XML 概念和体系

1.1XML 概念

XML 指可扩展标记语言(EXtensible Markup Language)

XML 没有预定义标签,需要自行定义标签

1.2XML 的特点

XML 数据以纯文本格式存储

实现不同应用程序之间的数据通信

实现不同平台间的数据通信

实现不同平台间的数据共享

使用 XML 将不同的程序、不同的平台之间联系起来

1.3XML 的作用

数据存储和数据传输

1.4XML 和 HTML 之间的差异

XML 主要作用是数据存储和传输(传输)

HTML 主要作用是用来显示数据(显示)

1.5一个标准的XML文档由的组成

XML 文档声明, 根元素,属性,子元素,文本(内容),注释

1.6XML 的基本语法

1) 有且只有一个根元素

2) XML 文档声明必须放在文档的第一行

3) 所有标签必须成对出现

4) XML 的标签严格区分大小写

5) XML 必须正确嵌套

6) XML 中的属性值必须加引号

7) XML 中,一些特殊字符需要使用“实体”

8) XML 中可以应用适当的注释

1.7XML 元素

XML 元素指的是开始标签到结束标签的部分

一个元素中可以包含

1) 其他元素 2) 文本 3) 属性 4) 以上的混合

1.8XML 命名规则

1) 名称可以包含字母、数字及其他字符

2) 名称不能以数字或者标点符号开始

3) 名称不能以字母 xml 开始

4) 名称不能包含空格

2.DTD和Schema 技术小结

(1) DTD简介及DTD验证的局限性

简介:文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

作用:验证是否是“有效”的 XML

局限性:不遵循XML语法;数据类型有限;不可扩展;不支持命名空间




java设计一个无限层级的树形菜单_java设计一个无限层级的树形菜单


PCDATA(Parsed Character DATA)的意思是被解析的字符数据

CDATA(Unparsed Character Data)不应由 XML 解析器进行解析的文本数据

(2) Schema 技术

简介:Schema 是 DTD 的代替者,名称为 XML Schema,用于描述XML 文档结构,比 DTD 更加强大,最主要的特征之一就是XML Schema 支持数据类型

1) Schema 是用 XML 验证 XML 遵循 XML 的语法

2) Schema 可以用能处理 XML 文档的工具处理

3) Schema 大大扩充了数据类型,而且还可以自定义数据类

4) Schema 支持元素的继承

5) Schema 支持属性组


java设计一个无限层级的树形菜单_xml_02


所有的 Schema 文档使用 schema 作为其根元素http://www.w3.org/2001/XMLSchema:用于验证当前 Schema文档的命名空间(用于验证Schema本身)同时它还规定了来自命名空间 XML Schema 的元素和数据类型应该使用前缀 xs:xmlns 相当于 java 中的 import, :xs“小名”,在使用时要写加“小名”做前缀。

(XML 使用 Schema 验证,那 Schema 也是一个 XML,谁来验证它?DTD)

使用Schema验证XML文档的步骤:

1) 创建 SchemaFactory 工厂

2) 建立验证文件对象

3) 利用 SchemaFactory 工厂对象,接收验证的文件对象,生成 Schema 对象

4) 产生对此 schema 的验证器

5) 要验证的数据(准备数据源)

6) 开始


import java.io.File;
import java.io.IOException;

import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class Test {
	public static void main(String[] args) throws SAXException {
		//(1)创建SchemaFactory工厂
		SchemaFactory sch=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
		//(2)建立验证文件对象
		File schemaFile=new File("book.xsd");
		//(3)利用SchemaFactory工厂对象,接收验证的文件对象,生成Schema对象
		Schema schema=sch.newSchema(schemaFile);
		//(4)产生对此schema的验证器
		Validator validator=schema.newValidator();
		//(5)要验证的数据(准备数据源)
		Source source=new StreamSource("book.xml");
		//(6)开始验证
		try {
			validator.validate(source);
			System.out.println("成功");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("失败");
		}
	}
}


3.DOM 方式解析 XML 数据

DOM解析 XML 的特点:形成了树结构,有助于更好的理解、掌握,且代码容易编写。

解析过程中,树结构保存在内存中,方便修改。

(1) DOM解析XML的步骤:

1) 创建一个 DocumentBuilderFactory 的对象

2) 创建一个 DocumentBuilder 对象

3) 通过DocumentBuilder的parse(...)方法得到Document对象

4) 通过 getElementsByTagName(...)方法获取到节点的列表

5) 通过 for 循环遍历每一个节点

6) 得到每个节点的属性和属性值

7) 得到每个节点的节点名和节点值

4.SAX 方式解析 XML 数据

简介:SAX,全称 Simple API for XML,是一种以事件驱动的XMl API,SAX 与 DOM 不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析 XML 具有速度快,占用内存少的优点

SAX 解析 XML 的步骤

1) 创建 SAXParserFactory 的对象

2) 创建 SAXParser 对象 (解析器)

3) 创建一个 DefaultHandler 的子类

4) 调用 parse 方法

5.JDOM 解析 XML 数据

简介:JDOM 是一种解析 XML 的 Java 工具包,它基于树型结构,利用纯Java的技术对XML文档实现解析。所以中适合于Java语言

JDOM 解析 XML 的步骤

1) 创建一个 SAXBuilder 对象

2) 调用 build 方法,得到 Document 对象(通过 IO 流)

3) 获取根节点

4) 获取根节点的直接子节点的集合

5) 遍历集合


package study610;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class TestJdom02 {
	public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException {
		SAXBuilder sax=new SAXBuilder();
		Document d1=sax.build(new FileInputStream("Test01.xml"));
		Element d2=d1.getRootElement();
		List<Element> list=d2.getChildren();
		
		for(int i=0;i<list.size();i++){
			Element el1=list.get(i);
			List<Attribute> list2=el1.getAttributes();//注意是getAttributes
			for(int j=0;j<list2.size();j++){
				Attribute att=list2.get(j);
				System.out.println(att.getName()+"t"+att.getValue());
			}
		}
		
		for(int i=0;i<list.size();i++){
			Element el2=list.get(i);
			List<Element> list3=el2.getChildren();
			for(int j=0;j<list3.size();j++){
				Element el3=list3.get(j);
				System.out.println(el3.getName()+"t"+el3.getValue());
			}
		}
	}
}


6.DOM4J 方式解析 XML 数据

简介:DOM4J 是一个 Java 的 XML API,是 JDOM 的升级品,用来读写 XML 文件的,JDOM 的一种智能分支,它合并了许多超出基本 XML 文档表示的功能。

DOM4J 解析 XML 的步骤

1) 创建 SAXReader 对象

2) 调用 read 方法

3) 获取根元素

4) 通过迭代器遍历直接节点


package study610;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class TestDom4j02 {
	public static void main(String[] args) throws FileNotFoundException, DocumentException {
		SAXReader sax=new SAXReader();
		Document d1=sax.read(new FileInputStream("book.xml"));
		Element el1=d1.getRootElement();//books
		
		for(Iterator<Element> it1=el1.elementIterator();it1.hasNext();){
			Element el2=it1.next();
			for(Iterator<Attribute> it2=el2.attributeIterator();it2.hasNext();){
				Attribute att1=it2.next();//注意点  it.next() 需要有接受变量
				System.out.println(att1.getName()+"t"+att1.getValue());
			}
		}
		
		System.out.println("------");
		List<Book> list =new ArrayList<Book>();
		Iterator<Element> ite=el1.elementIterator();
		while(ite.hasNext()){
			Book book2=new Book();
			Element el3=ite.next();
			for(Iterator<Element> ite2=el3.elementIterator();ite2.hasNext();){
				Element el4=ite2.next();
				System.out.println(el4.getName()+"t"+el4.getText());
				String temp=el4.getName();
				
				switch(temp){
				case "name":
					book2.setName(el4.getText());
					break;
				case "company":
					book2.setCompany(el4.getText());
					break;
				case "num":
					book2.setNum(Double.parseDouble(el4.getText()));
				}
			}
			list.add(book2);
		}
		for(Book b:list){
			System.out.println(b.getName()+"t"+b.getCompany()+"t"+b.getNum());
		}
		
	}
}


7.四种解析XML技术的特点

1)DOM 解析:

形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。

2)SAX 解析:

采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时

3)JDOM 解析:

仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

4)DOM4J 解析:

JDOM 的一种智能分支,它合并了许多超出基本 XML 文档表示的功能。它使用接口和抽象基本类方法。具有性能优异、灵活性好、功能强大和极端易用的特点。是一个开放源码的文件。

8.XPATH 技术_快速获取节点

(1) 简述XPATH技术?

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

(2) 使用XPATH技术快速获取节点需要做哪些准备工作?

1.导包:导入xpath支持的jar包:jaxen-1.1-beta-6

2. 使用xpath方法

document.selectSingleNode(" ")//查找一个节点对象

document.selectNodes(" ")// 查找多个节点对象