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

前端之家收集整理的这篇文章主要介绍了关于xml学习(三)—— JAXP-DOM解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


XML解析方式分为两种:domsax

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对象

ArrayList get(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>

猜你在找的XML相关文章