Java七分钟学习之操作XML


Java 操作XML

一、什么是XML

可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

XML约束

  • DTD 指定:可以在文档中存在的元素、那些元素可以具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序。

  • XML Schema 是基于 XML 的 DTD 替代者。XML Schema 可描述 XML 文档的结构。XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。


XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具。
使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它用不同于XML的语言编写,需要不同的分析器技术。这增加了工具开发商的负担,降低了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法。而XML Schema是按标准XML规则编写的,更容易掌握。二是DTD不支持名称空间。随着大部分的数据处理日益以XML为中心,信息的相互联系变得日益普及与深入,名称空间作用也将凸现。三是DTD在支持继承和子类方面的局限性。由于面向对象技术的出现,对继承和子类的支持已成为软件技术领域的主流概念。最后,DTD没有数据类型的概念,无法对特定元素施加数据类型,对强制性结构化无计可施,例如,如何规定名为Date的数据必须包含有效值。
这些就要依靠XML Schema了。XML Schema不仅可以定义XML文档的结构而且还允许约束文档的内容,这不同于DTD。另外,一个 XML Schema自身就是一个XML文档,其基于标签的语法比DTD中的特殊字符要清楚多了。XML Schema正是针对这些DTD的缺点而设计的,它完全使用XML作为描述手段,具有很强的描述能力、扩展能力和处理维护能力。
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。
XML Schema也是Web Services技术中需要使用的一个基本工具,然而并不是XML Schema的所有特性都会被广泛地使用,因此,本书将不对XML Schema规范做系统的介绍。目前主要有两种重要的模式:Microsoft XML Schema和W3C XML Schema,本章主要讨论W3C XML Schema。

二、XML解析方式

  • 在java中,解析XML文件的方式大致分为两种:DOM解析,SAX解析
    • Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。
      • 优点:可以进行增删查改
      • 缺点:可能会造成内存溢出
    • SAX解析基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据
      • 优点:速度快,可以处理大文件
      • 缺点:只能进行读操作
  • Android中还有另一种解析方式 :Pull解析(类似SAX)

    JAVA中常见的解析包

  • JAXP:sun公司提供的DOM和SAX开发包
  • JDom:dom4j的兄弟
  • Jsoup:处理html的特定解析开发包(类似于python中的BeautifulSoup)
  • dom4j:比较常见的解析包;hibernate底层使用

    三、dom4j的使用实例

1.通过dom4j简单操作XML文件

注意:需要下载并导入dom4j的jar包
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class TestDom4j {
	@Test
	public void testReadWebXML() {
		try {
			// 1.获取解析器
			SAXReader saxReader = new SAXReader();
			// 2.获得document文档对象
			Document doc = saxReader.read("src/cn/itheima/xml/schema/web.xml");
			// 3.获取根元素
			Element rootElement = doc.getRootElement();
			// System.out.println(rootElement.getName());//获取根元素的名称
			// System.out.println(rootElement.attributeValue("version"));//获取根元素中的属性值
			// 4.获取根元素下的子元素
			List<Element> childElements = rootElement.elements();
			// 5.遍历子元素
			for (Element element : childElements) {
				//6.判断元素名称为servlet的元素
				if ("servlet".equals(element.getName())) {
					//7.获取servlet-name元素
					Element servletName = element.element("servlet-name");
					//8.获取servlet-class元素
					Element servletClass = element.element("servlet-class");
					System.out.println(servletName.getText());
					System.out.println(servletClass.getText());
				}
			}

		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}

}

2.应用实例:通过读取XML文件完成实例化对象并调用其方法

Creature.java 生物类的接口 拥有共同的方法:叫和死亡

package com.an.example.dom4j;

public interface Creature {
	public void sing();
	public void destroyed();
}

Person.java 实现了Creature接口的类

package com.an.example.dom4j;

public class Person implements Creature {
	public Person() {
		System.out.println("出生~~~~");
	}
	public void sing() {
		System.out.println("hello~~");
	}
	public void destroyed() {
		System.out.println("凉凉");
	}
}

主函数:用于操作XML文件 读取配置 加载类 实例化并调用方法

package com.an.example.dom4j;

import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class ParseXML {
	public static void main(String[] args) {
//		 案例 :读取 类的全路径 通过反射加载
		try {
			// 创建saxReader对象
			SAXReader saxReader = new SAXReader();
			// 通过SAXReader对象读取XML文件
			Document document = saxReader.read("src/com/an/example/schema/TestXMLSchema.xml");
			// 访问根节点
			Element rootElement = document.getRootElement();
			//获取名为servlet的运算
			List<Element> elements = rootElement.elements("servlet");
			// Element element = rootElement.element("servlet");
			for (Element e : elements) {
				//获取servlet-class标签内的文本
				String text = e.element("servlet-class").getText();
				// 反射
				Class<?> class1 = Class.forName(text);
				// 实例化对象
				Object newInstance = class1.newInstance();
				Creature creature = (Creature) newInstance;
				// 调用共同的方法 sing()和destroyed()
				creature.sing();
				creature.destroyed();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

本文作者: 安炳旭
本文链接: http://bxan.xyz/2018/07/29/Java七分钟学习之操作XML/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!



文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录