XML
1.理解XML概念和优势
XML(eXtensible Markup Language) 可扩展的标记语言,文件格式:xml
目前采用1.0版本,W3C(万维网联盟 world wide web…)世界性的重力技术标准租住 给一系列内容制定标准,包含着XML
他的作用:
- 存储数据
- 数据传输格式
- 应用程序的配置文件
- AJAX的基石
2.汇编写格式良好的XML文档
XML文档由两部分组成:
- 声明:放在XML文档的第一行 用来标注文本文档的一个配置格式 version 采用的版本规范 encoding编码
- 主题的描述内容
主题的描述由标签(元素/节点/标记)组成。
一定有且仅有一个根标签
XML的标签
标签的语法:
<标签名 属性名="属性值"...> 标签内容</标签名>
标签的分类:
<books></books> 双标签:由开放标签和闭合标签组成的 中间可以添加内容 标签内可以添加属性信息
<books/> 单标签/自闭和标签 只能添加一些属性信息
标签的规范
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="bk001">
<name>深入JVM虚拟机</name>
<author>周志明</author>
<desc>深入去探究JVM虚拟机,目前已发行第二版。</desc>
</book>
<book id="bk002">
<name>人性的弱点</name>
<author>戴尔·卡耐基</author>
<desc>深入去探究人性弱点,天才在左疯子在右</desc>
</book>
</books>
3.了解XML中特殊字符的处理方式
有些时候我们确实需要在文件内存储一些符号,但是在XML中有些地方不允许出现< "等符号,我们可以使用转义符来解决此问题。
<(less than) <
>(greater than) >
'(apostrophe) '
"(quotes) "
& &
<![CDATA[ 无需考虑特殊符号的任意内容 ]]>
这个的使用可以在批量文本的时候,
可以使用常规的符号比如<号 >号可以直接使用符号
4.了解解析器和DOM树节点构造
DOM解析:它是会将XML内容加载到内存中生成对应的文档结构树(DOM树)。
DOM(Document Object Model)
在文档结构树中,它是由一系列的节点构成的,节点有不同的类型,
例如:标签转换为了元素节点。
5.会使用DOM操作XML数据
package cn.kgc.demo1;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMParser {
private static Document document;
/**
* 将内存中DOM树持久化到本地XML文件
* @param destXMLPath
* @throws Exception
*/
public static void transformDocument(String destXMLPath) throws Exception {
// 1.创建转换器工厂对象
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 2.创建转换器对象
Transformer transformer = transformerFactory.newTransformer();
// 3.指定数据源和输出目的地
Source xmlSource = new DOMSource(document);
Result outputTarget = new StreamResult(new File(destXMLPath));
// 4.配置转换格式
transformer.setOutputProperty("encoding", "UTF-8");
// 5.转换器对象进行转换XML
transformer.transform(xmlSource , outputTarget);
}
/**
* 添加XML内容
* 为了添加XML内容 思路:
* 1. 在内存中创建<book>元素节点
* 2. 给<book>元素节点添加id属性
* 3. 分别创建<name> <author> <desc>元素节点 并且指定好内容
* 4. 将三个元素节点添加到<book>元素节点下
* 5. 将<book>元素节点添加到<books>节点下
*/
private static void addXMLContent() {
// 1. 在内存中创建<book>元素节点
Element bookEle = document.createElement("book");
// 2. 给<book>元素节点添加id属性
bookEle.setAttribute("id", "bk003");
// 3. 分别创建<name> <author> <desc>元素节点 并且指定好内容
Element nameEle = document.createElement("name");
nameEle.setTextContent("聊斋志异");
Element authorEle = document.createElement("author");
authorEle.setTextContent("蒲松龄");
Element descEle = document.createElement("desc");
descEle.setTextContent("老舍:鬼狐有性格,笑骂成文章。");
// 4. 将三个元素节点添加到<book>元素节点下
bookEle.appendChild(nameEle);
bookEle.appendChild(authorEle);
bookEle.appendChild(descEle);
// 5.将<book>元素节点添加到<books>节点下
Node booksNode = document.getElementsByTagName("books").item(0);
booksNode.appendChild(bookEle);
}
/**
* 展示XML的内容
* 为展示此XML的内容 思路:
* 1. 获取所有的<book>元素节点
* 2. 遍历出每一个<book>元素节点
* 2.1 获取它的id属性值
* 2.2 获取它的所有子元素节点
* 2.3 遍历出每一个子元素,分别获取对应的元素内容
*/
public static void getXMLContent() {
// 1.获取所有的<book>元素节点
NodeList bookNodeList = document.getElementsByTagName("book");
// 2.遍历出每一个<book>元素节点
for(int i = 0; i < bookNodeList.getLength(); i++) {
// 每一个book元素节点
Node bookNode = bookNodeList.item(i);
// 2.1 获取它的id属性值
Element bookEle = (Element)bookNode;
String bookId = bookEle.getAttribute("id");
System.out.println("id:"+bookId);
// 2.2 获取它的所有子元素节点
NodeList bookChildNodes = bookEle.getChildNodes();
// 遍历出每一个子元素,分别获取对应的元素内容
for(int j = 0; j < bookChildNodes.getLength(); j++) {
Node bookChildNode = bookChildNodes.item(j);
// 因为你获取的<book>下的所有子节点 不仅仅包含元素节点 转换类型要小心
if(bookChildNode instanceof Element) {
Element bookChildEle = (Element)bookChildNode;
String tagName = bookChildEle.getTagName();
String textContent = bookChildEle.getTextContent();
System.out.println(tagName+":"+textContent);
}
}
System.out.println("-------------------------------");
}
}
/**
* 加载XML 产生DOM树对象
* @param xmlPath
* @throws Exception
*/
public static void getDocument(String xmlPath) throws Exception {
// 1.创建解析器工厂对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 2.解析器工厂创建解析器对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 3.解析器对象解析XML 产生DOM树对象
document = documentBuilder.parse(new File(xmlPath));
}
public static void main(String[] args) throws Exception {
// 1.加载DOM树
getDocument("src/books.xml");
// 2.查看XML内容
getXMLContent();
// 3.给XML添加内容
addXMLContent();
// 4.将内存中的DOM树内容持久化到本地文件
transformDocument("src/books.xml");
}
}
6. 使用DOM操作XML(修改和删除)
根据标签名获取元素节点列表:NodeList getElementsByTagName(String tagName);
获取节点列表的长度:int getLength();
根据索引获取节点列表中的元素:Node item(int index);
获取元素节点的属性:String getAttribute(String name);
设置元素节点的属性:void setAttribute(String name,String value);
获取和设置元素节点内容:
String getTextContent();
void setTextContent(String textContent);
获取元素节点的元素名:String getTagName();
获取节点的所有子节点列表:NodeList getChildNodes();
获取节点的父节点:Node getParentNode();
删除某个子节点:void removeChild(Node childNode);
7.使用DOM4J操作XML(CRUD)
1.6.1版本。
获取根元素:Element getRootElement();
获取指定名称的所有的子元素节点:List elements(String tagName);
获取所有的子元素节点:List elements();
获取指定的子元素节点(单个):Element element(String tagName);
获取指定子元素的内容:String elementText(String tagName);
获取指定子元素的内容(去除空格):String elementTextTrim(String tagName);
给元素节点添加属性:void addAttribute(String name,String value);
给元素节点添加内容:void addText(String text); 如果有内容则使用void setText(String text);
根据名称创建并添加子元素节点:Element addElement(String tagName);
删除子元素节点:void remove(Element element);
package cn.kgc.demo2;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class DOM4JParser {
// 别导错包
private static Document document;
/**
* 删除XML内容
* 需求:删除最后一个元素节点内容
*/
private static void deleteXMLContent() {
// 获取根元素
Element booksEle = document.getRootElement();
// 获取所有的book元素
List<Element> bookEleList = booksEle.elements("book");
// 获取最后一个
Element removeBookEle = bookEleList.get(bookEleList.size() - 1);
// 删除元素
booksEle.remove(removeBookEle);
}
/**
* 修改XML内容
* 需求:修改元素节点的内容 <book id="bk003">
* name:时间简史
* author:霍金
* desc:霍金著作!探究宇宙奥秘!
*/
public static void updateXMLContent() {
// 获取根元素
Element booksEle = document.getRootElement();
// 获取并遍历所有的<book>子元素列表
List<Element> bookEleList = booksEle.elements("book");
for (Element bookEle : bookEleList) {
// 查找bk003元素
if(bookEle.attributeValue("id").equals("bk003")) {
// 更改name author desc内容
Element nameEle = bookEle.element("name");
nameEle.setText("时间简史");
Element authorEle = bookEle.element("author");
authorEle.setText("霍金");
Element descEle = bookEle.element("desc");
descEle.setText("霍金著作!探究宇宙奥秘!");
}
}
}
/**
* DOM树转换为XML文档
* @param destXMLPath
* @throws Exception
*/
public static void formatDOM2XML(String destXMLPath) throws Exception {
XMLWriter xmlWriter = null;
try {
// 创建输出转换器对象
// compact紧凑的 format格式
// OutputFormat outputFormat = OutputFormat.createCompactFormat();
// pretty漂亮的
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
// 指定字符编码
outputFormat.setEncoding("UTF-8");
// 指定数据源和输出目的地
xmlWriter = new XMLWriter(new FileOutputStream(destXMLPath), outputFormat);
// 输出内容
xmlWriter.write(document);
} finally{
// 关流
xmlWriter.close();
}
}
/**
* 添加XML内容
*/
public static void addXMLContent() {
// 获取根元素
Element booksEle = document.getRootElement();
// 根元素添加子元素节点<book>
Element bookEle = booksEle.addElement("book");
bookEle.addAttribute("id", "bk003");
// 分别添加<name><author><desc>子元素节点 并赋值内容
Element nameEle = bookEle.addElement("name");
nameEle.setText("大话设计模式");
Element authorEle = bookEle.addElement("author");
authorEle.setText("程杰");
Element descEle = bookEle.addElement("desc");
descEle.setText("设计模式一点都不可怕!杰佬带你飞!");
}
/**
* 查询XML内容
*/
public static void getXMLContent() {
// document.getElementsByTagName("books").item(0);
// 获取根元素
Element booksEle = document.getRootElement();
// 获取并遍历所有的子元素节点
List<Element> bookEleList = booksEle.elements();
for (Element bookEle : bookEleList) {
// 获取id属性
String id = bookEle.attributeValue("id");
// 获取name元素内容(也可以先获取元素节点对象 然后再获取元素节点内容)
// 可以自动去除内容空格
String name = bookEle.elementTextTrim("name");
// 获取author元素内容
String author = bookEle.elementTextTrim("author");
// 获取desc元素内容
String desc = bookEle.elementTextTrim("desc");
System.out.println(id+" - "+name+" - "+author+" - "+desc);
}
}
/**
* 加载DOM树
* @param xmlPath
* @throwsException
*/
public static void loadDocument(String xmlPath) throws Exception {
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(xmlPath));
}
public static void main(String[] args) throws Exception {
// 加载DOM树
loadDocument("src/books.xml");
// 增加XML内容
// addXMLContent();
// 修改XML内容
// updateXMLContent();
// 删除XML内容
deleteXMLContent();
// 将内存中的DOM树转换为XML文档内容
formatDOM2XML("src/books.xml");
// 查询XML内容
getXMLContent();
}
}