Java高级编程--XML
Java高级编程–XML
文章目录
- Java高级编程--XML
- 1.XML简介
- 2.XML文档结构
- 3.XML标签
- 4.XML编写注意事项
- 5.XML解析器
- 6.XML命名空间
- 7.解析XML技术
- 7.1DOM解析XML
- 7.2DOM4J解析XML
- 7.2.1常用方法
- 7.2.2创建一个新的XML文档并设置XML编码将文档写入文件
- 7.2.3解析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"));}//遍历3Iterator<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");//保存XMLoutputXML("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);}}//保存XMLoutputXML("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);}}
}