您的位置:首页 > 其它

关于xml学习(三)—— JAXP-DOM解析

2015-01-04 13:47 253 查看

XML解析方式分为两种:dom和sax

dom:(DocumentObject Model,即文档对象模型)是
W3C组织推荐的解析XML的一种方式。
sax:(SimpleAPI for XML)
不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。
XML解析器:

Crimson(sun)、Xerces(IBM)、Aelfred2(dom4j)
XML解析开发包:
Jaxp(sun)、Jdom、dom4j、pull(android的sdk自带)

JAXP-DOM:

JAXP是Sun
提供的一套XML解析API,很好的支持DOM和SAX解析方式
JAXP 开发包是J2SE的一部分,包括以下包或子包:
|--javax.xml

|--org.w3c.dom

|--org.xml.sax
在 javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的DOM
或SAX
的解析器对象

DOM树:



使用DOM方式解析XML:

解析器工厂类DocumentBuilderFactory:

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
解析器类DocumentBuilder:
DocumentBuilder db =dbf.newDocumentBuilder();
解析生成Document对象:
Documentdoc = db.parse("message.xml");
通过Document对象查询节点:
document.getElementById 返回Node对象
document.getElementsByTagName 返回NodeList对象

节点列表类NodeList:

节点列表类NodeList就是代表了一个包含一个或者多个Node的列表,可以简单的把它看成一个Node的数组
常用方法

1)getLength():返回列表的长度。

ArrayList size

2)item(int):返回指定位置的Node对象

ArrayListget(index)

节点对象 Node:

Node对象提供了一系列常量来代表结点的类型
当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象
节点的操作:
getAttribute(String):返回标签中给定属性的值(元素)
getAttributeNode(name):返回指定名称的属性节点(元素)

getNodeName():返回节点的名称(元素-->标签名)
getNodeType():返回节点的类型
getNodeValue():返回节点的值

getChildNodes():返回这个节点的所有子节点列表
getFirstChild():返回这个节点的第一个子节点

getParentNode():返回这个节点的父节点对象

appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去
removeChild(org.w3c.dom.Node):删除给定的子节点对象
replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象

getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的getPreviousSibling()方法返回其前一个兄弟节点
getPreviousSibling()方法返回其前一个兄弟节点

忽略元素中空白内容: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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: