什么是XML
XML:eXtensible Markup Language 可扩展标记语言
- 可扩展:所有标签都是自定义的
- 功能:数据存储、配置文件、数据传输
- xml和html区别:
html语法松散,xml语法严格
html做页面展示,xml做数据存储
html所有标签都是预定义的,xml都是自定义的
XML语法
<?xml version="1.0" encoding="UTF-8"?>
<!-- 文档声明,必须写在第一行-->
<!--
version ="版本号"
encoding ="字符集"
-->
<!--
注释可以出现在除标签内部以为的任何位置。注释不能嵌套!
-->
<!-- 元素的写法 -->
<!--
1、文档中有且只有一个根元素
2、元素需要正确闭合
3、元素必须正确嵌套
4、元素的命名规范
区分大小写、不能以数字或xml开头、不能包含空格
-->
<!-- 文档解析
jaxp sun公司开发(但自己都不用)
jdom 开源组织开发的
dom4j 开源组织,sun也用
jdom的升级产品
DOM4j的使用:参考Dom4j.java
-->
<!-- 根元素,有且只有一个 -->
<persons><!-- 头标签 -->
<!-- 子元素
属性必须用引号,单引双引都可以
-->
<person id='p1'>
<name>张三</name>
<age>11</age>
</person>
<person id="p2">
<!-- 文本
转义字符:&开头;结尾
<![CDATA[文本]]>
-->
<name>李四<![CDATA[if(a>b&&a<c)]]></name>
<age><&</age>
</person>
</persons><!-- 尾标签 -->
XML解析JAVA技术介绍
1、DOM Document Object Model 文档对象模型
关键字:树(Document)
优点:把XML文件在内存中构造树形结构,可以遍历和修改
缺点:如果文件较大,内存有压力,解析的时间会比较长
2、SAX Simple API for XML 基于XML的简单API
关键字:流(Stream)
把XML作为输入流,触法标记开始,内容开始,标记结束等
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对节点做修改
3、JDOM/DOM4J
DOM4J结合了DOM和SAX两种解析方式的优点
基于DOM4J操作XML
package com.offcn.xml;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
/**
* DOM4j的使用
* 使用需导入jar包
* DOM4J:dom4j-1.6.1.jar
*/
public class Dom4j {
@Test
public void run1() throws Exception {
//解析XML
//0、创建解析XML的核心对象
SAXReader reader = new SAXReader();
//0、读取加载需要解析的xml
Document document = reader.read("src/com/offcn/xml/Demo1.xml");
//1、获取xml中的根元素
Element rootElement = document.getRootElement();
//getName()获取标签名
// System.out.println(rootElement.getName());
//2、获取根元素下的所有子元素
List<Element> list = rootElement.elements();
// for (Element e : list) {
// System.out.println(e.getName());
// }
//3、获取元素的属性值
Element p1 = list.get(0);//第一个person元素
//3.1、p1.attribute("id").getValue()
//attribute取到的是整个属性
Attribute attribute = p1.attribute("id");
// System.out.println(attribute);
//attribute.getValue()取到属性对应的值
String value = attribute.getValue();
// System.out.println(value);
//3.2、直接通过元素获取当前的值
String attributeValue = p1.attributeValue("id");
// System.out.println(attributeValue);
// System.out.println("-----------------------------------");
//4、获取指定元素下的子元素
Element pname = p1.element("name");//第一个person元素下的name元素
// System.out.println(pname);
//获取标签的标签名
// System.out.println(pname.getName());
//5、获取元素内的文本
// System.out.println(pname.getText());
//5.1获取指定元素下的子元素的文本
// System.out.println(p1.elementText("age"));
}
}
XPath操作XML
package com.offcn.xml;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
/**
* XPath
* 基于Dom4j的免费工具
*
* 使用需导入jar包
* DOM4J:dom4j-1.6.1.jar
* XPath:jaxen-1.1-beta-6.jar
*
* 简化DOM4J的操作,定位更准确
*
* 可参考本机G:\offcn\API\API-JavaEE\WEB\XPathTutorial实例教程
*/
public class XPath {
@Test
public void run1() throws Exception {
//0、创建解析XML的核心对象
SAXReader reader = new SAXReader();
//0、将XML文件加载到内存中
Document document = reader.read("src/com/offcn/xml/demo1.xml");
//1、获取节点对象
//1.1、获取单节点对象
Node node = document.selectSingleNode("/persons/person/name");
System.out.println(node.getText());
//1.2、获取多节点对象
List<Node> nodes = document.selectNodes("//*");
for (Node n : nodes) {
System.out.println(n.getName()+" "+n.getText());
}
}
@Test
public void run2() throws Exception {
//0、创建解析XML的核心对象
SAXReader reader = new SAXReader();
//0、将XML文件加载到内存中
Document document = reader.read("src/com/offcn/xml/demo1.xml");
//
List<Node> nodes = document.selectNodes("//*[@id='p2']/name");
for (Node n : nodes) {
System.out.println(n.getName()+" "+n.getText());
}
}
}