Java高级编程-XML
目录
Java高级编程–XML
Java高级编程–XML
1.XML简介
XML(EXtensible Markup Language),可扩展标记语言
特点
- XML与操作系统、编程语言的开发平台无关
- 实现不同系统之间的数据交换
作用
- 数据交互
- 配置应用程序和网站
- Ajax基石
2.XML文档结构
XML文档结构:
- 声明:XML 声明文件的可选部分,若存在需要放在文档的第一行
- 文档描述信息
<?xml version="1.0" encoding="UTF-8"?> //声明
声明:version:文档符合xml1.0规范
encoding:文档字符编码,默认为UTF-8
<books>
<!--图书信息 -->
<book id="bk101">
<author>王珊</author>
<title>.NET高级编程</title>
<description>包含C#框架和网络编程等</description>
</book>
<book id="bk102">
<author>李明明</author>
<title>XML基础编程</title>
<description>包含XML基础概念和基本作用</description>
</book>
</books>
文档结构解释:
XML文档必须有一个根元素
根元素的开始标签:放在最前面
根元素的结束标签:放在最后面
标签内容在开始标签和结束标签之间
元素可以包含属性,属性提供有关元素的附加信息。
3.XML标签
XML文档内容由一系列标签元素组成
属性值用双引号包裹
<元素名 属性名=“属性值”>元素内容</元素名> eg: <student id="001"> <name>王显明</name> <expectedscore>75</expectedscore> <actualscore>80</actualscore> </student>
一个元素可以有多个属性
属性值中不能直接包含
<
、“
、&
不建议使用的字符:
‘
、>
空元素:
<name> </name>
<name></name>
<name/>
4.XML编写注意事项
所有XML元素都必须有结束标签
XML标签对大小写敏感
XML必须正确的嵌套
同级标签以缩进对齐
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格
实体引用来代替 特殊字符
<
< less than >
> greater than &
& ampersand '
’ apostrophe "
" quotation mark XML 中的注释
<!--This is a comment -->
避免
-
字符避免
.
字符避免
:
字符
5.XML解析器
- 解析器类型
- 非验证解析器
- 检查文档格式是否良好
- 验证解析器
- 使用DTD检查文档的有效性
- 非验证解析器
6.XML命名空间
- XML命名空间的作用
- 解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素
7.解析XML技术
- DOM
- 基于XML文档树结构的解析
- 适用于多次访问的XML文档
- 特点:比较消耗资源
- SAX
- 基于事件的解析
- 适用于大数据量的XML文档
- 特点:占用资源少,内存消耗小
- DOM4J
- 非常优秀的Java XML API
- 性能优异、功能强大
- 开放源代码
7.1DOM解析XML
DOM介绍
- 文档对象模型(Document Object Model)
- DOM把XML文档映射成一个倒挂的树
常用接口介绍
- DOM解析包:org.w3c.dom
常用接口 | 常用方法 | 说明 |
---|---|---|
Document:表示整个 XML 文档 | NodeList getElementsByTagName(String Tag) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
Document:表示整个 XML 文档 | Element createElement(String tagName) | 创建指定标记名称的元素 |
Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素的所有子节点,返回节点集合 |
Element:XML 文档中的一个元素 | String getTagName() | 获取元素名称 |
访问DOM树节点
DOM解析XML文件步骤
- 创建解析器工厂对象
- 解析器工厂对象创建解析器对象
- 以Document对象为起点操作DOM树
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <name>Java程序设计</name> <author>王显明</author> <price>50</price> </book> <book > <name>Java基础</name> <author>黑马程序员</author> <price>50</price> </book> <book> <name>数据结构</name> <author>严蔚敏</author> <price>70</price> </book> </books>
package com.hz.ch10; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class Test { public static void main(String[] args) { try{ //创建DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //创建DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); //解析XML文档,返回Document对象 Document d=db.parse("book.xml"); //获取根元素 d.getDocumentElement().normalize(); //获取所有book元素 Element element=d.getDocumentElement(); NodeList nodeList=element.getElementsByTagName("book"); for (int i = 0; i < nodeList.getLength(); i++) { System.out.println(nodeList.item(i).getTextContent()); } } catch (Exception e) { e.printStackTrace(); } } }
保存XML文件
- 获得TransformerFactory对象
- 创建Transformer对象
- 创建DOMSource对象
- 包含XML信息
- 设置输出属性
- 编码格式
- 创建StreamResult对象
- 包含保存文件的信息
- 将XML保存到指定文件中
添加DOM节点
修改/删除DOM节点
7.2DOM4J解析XML
7.2.1常用方法
org.dom4j.Document常用方法
获取根节点
Element getRootElement();
org.dom4j.Element的常用方法
返回标签的名称
String getName();
获取当前节点下所有子节点
List<Element> elements();
获取指定属性名称的属性值
String attributeValue(String name)
获取标签文本
String getText()
获取指定名称的子标签的文本
String elementText(String name);
设置XML编码
OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8");
新XML添加Documen对象
Document document = DocumentHelper.createDocument();
创建节点Element对象.addElement(“节点名”)
Element apple = fruit.addElement("apple");
节点添加,修改属性Element对象
addAttribute("节点属性名",“属性值”) apple.addAttribute("type", "red");
7.2.2创建一个新的XML文档并设置XML编码将文档写入文件
package com.hz.ch10.dom4jtest01;
/**
* 创建XML文件
*/
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Test01 {
public static void main(String[] args) {
//创建Document对象
Document document = DocumentHelper.createDocument();
//添加根元素
Element fruit = document.addElement("fruit");
//添加子元素
Element apple = fruit.addElement("apple");
//添加属性
apple.addAttribute("type", "red");
apple.addElement("name").addText("红富士");
apple.addElement("weight").addText("0.5kg");
Element mango = fruit.addElement("mango").addAttribute("type", "yellow");
mango.addElement("name").addAttribute("id", "1001").addText("芒果");
mango.addElement("weight").addText("0.3kg");
//写出到文件
try {
FileWriter fw = new FileWriter("fruit1.xml");
XMLWriter xmlWriter = new XMLWriter(fw);
xmlWriter.write(document);
xmlWriter.close();
fw.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//格式化输出
OutputFormat of =null;
XMLWriter xmlWriter=null;
try {
FileWriter fw = new FileWriter("fruit2.xml");
of = OutputFormat.createPrettyPrint();
xmlWriter = new XMLWriter(fw, of);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
//紧凑输出
try {
of=OutputFormat.createCompactFormat();
xmlWriter=new XMLWriter(System.out,of);
xmlWriter.write(document);
xmlWriter.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
7.2.3解析XML文件
package com.hz.ch10.dom4jtest01;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
/**
* 解释XML文件
*/
public class Test02 {
public static void main(String[] args) {
try {
//解析器
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("fruit1.xml");
//获取根元素
Element fruit = document.getRootElement();
//遍历根的子元素
Iterator<Element> it = fruit.elementIterator();
while (it.hasNext()){
Element element = it.next();
System.out.println(element.getName()+"的属性:"+element.attributeValue("type"));
}
//遍历元素名为“apple”的根的子元素
Iterator<Element> elementIterator = fruit.elementIterator("apple");
while (elementIterator.hasNext()){
Element element = elementIterator.next();
System.out.println(element.getName()+"的属性:"+element.attributeValue("type"));
}
//遍历3
Iterator<Element> elementIterator = fruit.elementIterator();
while (elementIterator.hasNext()) {
Element child = elementIterator.next();
//获取当前子元素下的<name>标签
Element name = child.element("name");
//获取<name>标签的文本内容
String text = name.getText();
System.out.println(child.getName() + "的名称:" + text);
//获取当前子元素下的<weight>标签
Element weight = child.element("weight");
System.out.println(child.getName() + "的重量:" + weight.getText());
String id = name.attributeValue("id");
if (id != null) {
System.out.println(child.getName() + "的id:" + id);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
- DOM4J解析XML工具类
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileWriter;
import java.util.List;
public class UtilsXML {
private static Document document=null;
/**
* 初始化
* @param path
* @throws Exception
*/
public static void info(String path) throws Exception {
//构建XML的解析器
SAXReader saxReader = new SAXReader();
//读取XML文件 返回Document对象
document = saxReader.read(path);
}
/**
* 新增XML
*/
public static void saveXML(){
document = DocumentHelper.createDocument();
Element root = document.addElement("books");
Element book = root.addElement("book").addAttribute("id", "1001");
book.addElement("name").setText("Java");
}
/**
* 读取XML
*/
public static void findXML(){
Element root = document.getRootElement();
List<Element> elementList= root.elements();
for (Element element : elementList) {
String id=element.attributeValue("type");
System.out.println("-----"+id+"------");
//获取子元素
List<Element> elementList1 = element.elements();
for (Element element1 : elementList1) {
System.out.println(element1.getName()+""+element1.getText());
}
}
}
/**
* 编辑XML
*/
public static void editXML() throws Exception {
Element rootElement = document.getRootElement();
List<Element> elementList = rootElement.elements();
for (Element element : elementList) {
if(element.attributeValue("type").equals("yellow")){
element.element("name").setText("mango");
}
}
Element grape = rootElement.addElement("grape");
grape.addAttribute("type","purple");
grape.addElement("name").setText("葡萄");
grape.addElement("weight").setText("0.1kg");
//保存XML
outputXML("fruit2.xml");
}
/**
* 删除XML
*/
public static void delXML() throws Exception {
Element rootElement = document.getRootElement();
List<Element> elementList = rootElement.elements();
for (Element element : elementList) {
if(element.attributeValue("type").equals("purple")){
element.getParent().remove(element);
}
}
//保存XML
outputXML("fruit2.xml");
}
/**
* 写入XML
* @param path
* @throws Exception
*/
public static void outputXML(String path) throws Exception {
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileWriter(path),outputFormat);
xmlWriter.write(document);
xmlWriter.close();
}
public static void main(String[] args) {
try {
info("fruit2.xml");
//findXML();
//editXML();
delXML();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}