Servlet复习-XML
好久没有写博客了,由于最近管理项目事情实在是太多了,代码都很少敲了,项目中有用到解析XML文件的技术点,解析XML是很老的技术,九几年标准就定了,这次抽几分钟复习一下吧。
一、什么是 XML?(来自w3school的释义)
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
二、XML特点
-必须有一个根元素(自定义xml时注意)
-XML语法严格,标签必须成对出现
-XML区分大小写
三、XML格式(如下)
<?xml version="1.0" encoding="UTF-8" ?>
<!--
xml文件头(固定)
version版本:1.0(常用) 1.1
encoding:编码格式
-->
<person>
<info id="p1">
<name>李白</name>
<age>25</age>
<sex>男</sex>
<address/>
<!--每一个标签必须结束-->
</info>
<info id="p2">
<name>杜甫</name>
<age>18</age>
<sex>男</sex>
<address/>
</info>
</person>
四、XML作用(最重要)
-传递数据(现在一般大厂的API在被调用时,都会返回两种格式的结果 XML 或者 JSON,JSON化是现在的趋势,数据量小,占用资源更少,流量用的更少,响应速度更快)
-保存数据(作用:用作配置文件)
五、XML的问题?
标签乱写,没有验证容易写错或者漏写!!!
需要一套规范(定义XML语法(标签顺序和个数))
六、规范
由于第五条的问题点,所以XML就出现了规范。
-DTD 文档类型定义(Document Type Definition)
-DTD 可以看成一个或者多个XML文件的模板,在这里可以定义XML文件中的元素、元素的属性、元素的排列方式、元素包含的内容等等。
-DTD有四个组成如下:
元素(Elements)
属性(Attribute)
实体(Entities)
注释(Comments)
-一个XML文件只能导入一个DTD文件
-由于DTD限制较多,使用时较不方便,近来已渐被XML Schema所取代。
七、XML Schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 可描述 XML 文档的结构。
XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
XML Schema 比 DTD 更强大。
-一个XML文件可以导入多个Schema文件
-命名空间(防止XML标签重名问题)
-一个功能一个命名空间(比如Spring配置文件中的tx:xx标签,tx就是命名空间)
八、XML的解析方式(两种方式)
1、DOM:将xml文件解析成一个DOM树,类似HTML的DOM树,然后再解析
2、SAX:该方式一行一行的解析xml文件,一旦解析过了再想回上一行,就需要重头解析;
九、DOM4j
在java中,使用DOM4j来解析XML,这个是基于DOM解析方式,在java中实现解析XML的技术。
十、举例
自定义一个XML文件person.xml放到项目路径下
<?xml version="1.0" encoding="UTF-8" ?>
<!--
xml文件头(固定)
version版本:1.0(常用) 1.1
encoding:编码格式
-->
<person>
<info id="p1">
<name>李白</name>
<age>25</age>
<sex>男</sex>
<address/>
<!--每一个标签必须结束-->
</info>
<info id="p2">
<name>杜甫</name>
<age>18</age>
<sex>男</sex>
<address/>
</info>
</person>
maven的pom.xml文件需要导入两个依赖
<dependencies>
<!--Dom4j 基本功能依赖包-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!--Dom4j 使用XPath时,需导入的高级功能依赖包-->
<dependency>
<groupId>xml</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
1、通过Dom4j遍历,获取各节点信息
/**
* 1、Document:代表整个XML文档
* 2、Element:代表了XML中的元素
* @param args
* @throws DocumentException
*/
public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("D:\\workspace_idea\\Servlet\\Servlet-01\\src\\main\\person.xml"));
System.out.println(document);
String xmlEncoding = document.getXMLEncoding();
//获取根元素
Element rootElement = document.getRootElement();
for (Iterator i = rootElement.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
//获取标签名和id属性值
System.out.println(element.getName() + "=====" + element.attributeValue("id"));
for (Iterator t = element.elementIterator(); t.hasNext(); ) {
Element ee = (Element) t.next();
//获取标签名和文本值
System.out.println(ee.getName() + "++++" + ee.getText());
}
}
}
2、通过XPath语言中的表达式获取指定节点信息(高级用法)
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
对 XPath 的理解是很多高级 XML 应用的基础。
/**
* 1、document.selectNodes():选择多个节点
* 2、document.selectSingleNode():选择一个节点
* @param args
* @throws DocumentException
*/
public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("D:\\workspace_idea\\Servlet\\Servlet-01\\src\\main\\person.xml"));
List<Element> list = document.selectNodes("//info/name");
for (Element element : list) {
System.out.println(element.getText());
}
}