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数据,不易编码,而且很难同时访问同一个文档中的多处不同数据
- 优点:速度快,可以处理大文件
- 缺点:只能进行读操作
- Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。
- 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 许可协议。转载请注明出处!