JAXP 解析XML DOM解析 SAX解析
java.xml.parsers 存放 DOM和SAX解析器
java.xml.stream 存放 STAX解析相关类
org.w3c.dom 存放DOM解析时 数据节点类
org.xml.sax 存放SAX解析的相关工具类
1.DOM 解析 树形结构
元素、属性、文本都被解析成节点,属性节点不属于任何节点的子节点和父节点
(1)创建XML文档
在企业实际开发中,为了简化xml 生成和解析 —- xml 数据文件通常不使用约束的
(2)使用DOM解析xml
将整个xml文档加载到内存中 : 工厂 — 解析器 — 解析加载
(3)、Document通过 getElementsByTagName 获得 节点集合 NodeList
通过 NodeList 提供 getLength 和 item 遍历 节点集合
遍历ArrayList
for (int i=0;i
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
<!ELEMENT books (book+) >
<!ELEMENT book (name,price) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!ATTLIST book
id ID #REQUIRED
>
]>
<books>
<book id="a1">
<name>java基础</name>
<price>80</price>
</book>
<book id="a2">
<name>java 编程思想</name>
<price>1000</price>
</book>
<book id="a3">
<name>编程思想</name>
<price>1000</price>
</book>
</books>
package com.qddx;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMTest {
@Test
// 将 books.xml 加载内存中,将文档内容 写入另一个xml books_bak.xml 回写
public void demo5() throws Exception {
// 将 文档 载入内存
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 回写xml 用到 Transformer
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);// 用document构造数据源
StreamResult result = new StreamResult(new File("books_bak.xml"));
transformer.transform(domSource, result);
}
@Test
// getElementById 用法 --- 查找 id a1 图书 名称
public void demo4() throws Exception {
// 装载xml 加载内存 --- Document对象
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 直接通过id 查找 ----- 文档必须使用 约束 --- 不用约束xml文档 不能 使用getElementById
Element book = document.getElementById("a1");
System.out.println(book);
System.out.println(book.getChildNodes().item(1).getTextContent());
}
@Test
public void demo3() throws Exception {
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = bf.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 利用好全局查询锁定每个name节点
NodeList nodelist = document.getElementsByTagName("book");
for (int i = 0; i < nodelist.getLength(); i++) {
Element name = (Element) nodelist.item(1);
if (name.getTextContent().equals("java基础")) {
// priceshi name 节点兄弟的兄弟
Element price = (Element) name.getNextSibling()
.getNextSibling();
System.out.println(price.getTextContent());
}
}
}
@Test
// 查询Java 基础 售价
public void demo2() throws Exception {
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = bf.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 全局查找 作为程序的切入
NodeList nodelist = document.getElementsByTagName("book");
for (int i = 0; i < nodelist.getLength(); i++) {
Element book = (Element) nodelist.item(i);
// 找book节点当中 name节点的值 java 基础
NodeList chidren = book.getChildNodes();
// System.out.println(chidren.getLength());
Element name = (Element) chidren.item(1);// book的第二个子节点解释name
if (name.getTextContent().equals("java基础")) {
// 当前for循环这本书是目标图书
// 打印图书价格price 是book的第四个子节点
Element price = (Element) chidren.item(3);
System.out.println(price.getTextContent());
}
}
}
@Test
public void demo1() throws Exception {
// 通过DOM解析XML --载入整个XML工厂--解析器--加载
// 构造工厂
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
// 使用工厂获得解析器
DocumentBuilder builder = bf.newDocumentBuilder();
// 使用解析器加载XML文档
Document document = builder.parse("books.xml");
// Document 代表整个XML文档,通过Document 操作XML数据
// 将所图书的名称打印出来
// nodelist 代表节点的集合
NodeList nodelist = document.getElementsByTagName("name");
// 遍历集合中所有的node
System.out.println("图书name节点数量:" + nodelist.getLength());
for (int i = 0; i < nodelist.getLength(); i++) {
Node node = nodelist.item(i);// 这里每个node都是<name></name>---元素
Element e = (Element) node;// 将节点转换为子类型节点
System.out.println(e.getNodeName());
System.out.println(e.getNodeType());
System.out.println(e.getNodeValue());
// 输出name元素节点的子节点
// System.out.println(e.getFirstChild().getNodeValue());
System.out.println(e.getTextContent());
System.out.println(" ");
}
}
}
package com.qddx;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class DOMCURT {
@Test
// 删除包含java图书名称的图书
public void testDelete() throws Exception {
// 加载xml到内存
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = bf.newDocumentBuilder();
Document document = builder.parse("books.xml");
NodeList nodelist = document.getElementsByTagName("name");
for (int i = 0; i < nodelist.getLength(); i++) {
Element name = (Element) nodelist.item(i);
if (name.getTextContent().contains("java")) {
// 删除这本书 通过name 获得图书
Element book = (Element) name.getParentNode();
// 删除必须通过父节点
book.getParentNode().removeChild(book);
i--;
}
}
// 回写
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
StreamResult result = new StreamResult(new File("books_bak.xml"));
transformer.transform(domSource, result);
}
@Test
// 强Java基础的价格上调20%
public void testUpdate() throws Exception {
// 加载xml到内存
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = bf.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 查找Java基础
NodeList nodelist = document.getElementsByTagName("name");
for (int i = 0; i < nodelist.getLength(); i++) {
Element name = (Element) nodelist.item(i);
if (name.getTextContent().equals("java基础")) {
// 找到改价格
Element price = (Element) name.getNextSibling()
.getNextSibling();
double money = Double.parseDouble(price.getTextContent());
money = money * 1.2;
price.setTextContent(money + "");
}
}
// 回写
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
StreamResult result = new StreamResult(new File("books_bak.xml"));
transformer.transform(domSource, result);
}
@Test
// 向XML中添加一个book元素
public void testAdd() throws Exception {
// 将原来的book.xml加载到内容
DocumentBuilderFactory bf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = bf.newDocumentBuilder();
Document document = builder.parse("books.xml");
// 添加节点 创建节点
Element newbook = document.createElement("book");// <book><book>
newbook.setAttribute("id", "a3");
// 创建一个name节点
Element newName = document.createElement("name");
newName.setTextContent("编程高手秘籍");
// 将新的name加载到新的book
newbook.appendChild(newName);
// 添加节点到指定位置
Element root = document.getDocumentElement();// 找到根节点
root.appendChild(newbook);// 添加子节点到根节点
// 回写xml
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource domSource = new DOMSource(document);// 用DOM构造数据源
StreamResult result = new StreamResult(new File("books_bak.xml"));
transformer.transform(domSource, result);
}
}
以上笔记来自于视频教程,只为自己以后更方便的查询和学习。