XML解析方式分为两种:dom和sax
dom
:
(DocumentObject Model,
即文档对象模型
)
是
W3C
组织推荐的解析
XML
的一种方式。
XML
解析器:
Crimson
(
sun
)、
Xerces
(
IBM
)、
Aelfred2
(
dom4j
)
XML
解析开发包:
JAXP-DOM:
|--javax.xml
|--org.w3c.dom
|--org.xml.sax
|--org.w3c.dom
|--org.xml.sax
DOM树:
使用DOM方式解析XML:
解析器工厂类
DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
解析器类
DocumentBuilder:
DocumentBuilder
db =
dbf.newDocumentBuilder
();
Documentdoc =
db.parse
("message.xml");
document.getElementById
返回
Node
对象
document.getElementsByTagName
返回
NodeList
对象
节点列表类NodeList:
节点列表类
NodeList
就是代表了一个包含一个或者多个
Node
的列表,可以简单的把它看成一个
Node
的数组
常用方法
1)getLength():返回列表的长度。
ArrayList
size
2)item(int):返回指定位置的Node对象
ArrayList
get(index)
节点对象 Node:
Node
对象提供了一系列常量来代表结点的类型
当开发人员获得某个
Node
类型后,就可以把
Node
节点转换成相应的节点对象
节点的操作:
getNodeType
()
:返回节点的类型
getNodeValue
()
:返回节点的值
getChildNodes
()
:返回这个节点的所有子节点列表
getFirstChild
()
:返回这个节点的第一个子节点
getParentNode () :返回这个节点的父节点对象
getParentNode () :返回这个节点的父节点对象
replaceChild
(org.w3c.dom.Node new
,
org.w3c.dom.Node old)
:用一个新的
Node
对象代替给定的子节点对象
忽略元素中空白内容:builderFactory.setIgnoringElementContentWhitespace(true);
实例:
XML
的
CURD
操作:
CUDTest.java:
<span style="font-size:14px;">package com.example.jaxp.dom; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.Transformer; 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 CUDTest { public static void main(String[] args) throws Exception { /* * 将内容进行修改:增,删,改 */ // 读取document Document document = CUDTest.getDocument(); add(document); update(document); remove(document); } private static void add(Document document) throws Exception { // 增: /* * <book id="b002"> <title>Java in Thinking</title> <price>45</price> * </book> */ // 获取根元素 Element rootElement = document.getDocumentElement(); // 创建book元素 Element newBook = document.createElement("book"); // 添加属性 newBook.setAttribute("id","b003"); // 添加元素 Element title = document.createElement("title"); title.setTextContent("编程思想"); newBook.appendChild(title); // 将book元素添加进根元素中 rootElement.appendChild(newBook); // 保存 sava(document); } private static void remove(Document document) throws Exception { // 删:删除<book id="b001"> // 获取所有的书籍 NodeList bookList = document.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { // 获取一本书 Node bookNode = bookList.item(i); // 获取属性 Element bookElement = (Element) bookNode; String id = bookElement.getAttribute("id"); // 判断id if (id.equals("b001")) { // 获取父节点 Node parent = bookElement.getParentNode(); // 从父节点删除子节点 parent.removeChild(bookElement); } } // 保存 sava(document); } private static void update(Document document) throws Exception { // 修改:修改<price>22</price> 为35 // 获取所有的书籍 NodeList bookList = document.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { // 获取一本书 Node bookNode = bookList.item(i); // 获取属性 Element bookElement = (Element) bookNode; String id = bookElement.getAttribute("id"); // 判断id if (id.equals("b001")) { // 获取所有的title NodeList priceList = bookElement.getElementsByTagName("price"); // 获取唯一的title Node price = priceList.item(0); // 修改: price.setTextContent("35"); } } // 保存 sava(document); } private static void sava(Document document) throws Exception { //保存 // 获取持久化对象工厂实例 TransformerFactory factory = TransformerFactory.newInstance(); // 获取持久化 Transformer transformer = factory.newTransformer(); // 源: Source xmlSource = new DOMSource(document); // 结果: StreamResult outputTarget = new StreamResult("Book.jasp.xml"); transformer.transform(xmlSource,outputTarget); System.out.println("done"); } public static Document getDocument() throws Exception { //读 // 获取解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 获取解析器 DocumentBuilder builder = factory.newDocumentBuilder(); // 获取document Document document = builder.parse("Book.xml"); return document; } } </span>
(读取)DomTest.java:
<span style="font-size:14px;">package com.example.jaxp.dom; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.example.domain.Book; public class DomTest { public static void main(String[] args) throws Exception { System.out.println(getAllBooks()); } /* * 获得所有的书籍,将所有的书籍内容保存list */ public static List<Book> getAllBooks() throws Exception { String title = ""; String price = ""; //创建list,用于保存所有的数据 List<Book> bookList = new ArrayList<Book>(); /* * 从xml文档中将需求的数据,查询出来,替换模拟数据 */ // 获得工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 获得解析器 DocumentBuilder builder = factory.newDocumentBuilder(); // 获得document ----解析xml文件 路径问题会导致:java.io.FileNotFoundException Document document = builder.parse("Book.xml"); // 获取元素 NodeList bookElements = document.getElementsByTagName("book"); // 遍历所有的书籍元素,获取元素属性 for (int i = 0; i < bookElements.getLength(); i++) { Node node = bookElements.item(i); // 父类给子类 Element bookEle = (Element) node; // 获取 元素属性 id String id = bookEle.getAttribute("id"); //System.out.println(id); // 查询title和price // 获取当前节点(book元素)的所有子节点 NodeList childList = bookEle.getChildNodes(); // 遍历子节点 for (int c = 0; c < childList.getLength(); c++) { // 获取所有的孩子 Node childNode = childList.item(c); String childName = childNode.getNodeName(); // 判断标签是否是title if ("title".equals(childName)) { // 获取title内容 title = childNode.getTextContent(); } else if ("price".equals(childName)) { // 获取price内容 price = childNode.getTextContent(); } } // 创建Javabean对象 Book book = new Book(); book.setId(id); book.setTitle(title); book.setPrice(price); bookList.add(book); } return bookList; } } </span>