关于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 size2)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>
相关文章推荐
- 关于xml学习(三)—— JAXP-SAX解析
- 关于MSSQL 2000中Select语句FOR XML产生XML文件学习心得
- 今天学习关于xml中用一个元素表示一个ds
- Sharepoint学习笔记---关于Element.xml中Ghostable与GhostableInLibrary属性设置
- flash学习笔记(五)--关于XML知识【重点】
- 关于solr中data-config.xml里面的各种Query的执行过程的学习
- XML学习笔记(一):关于字符编码的理解
- SharePoint【学习笔记】-- 关于Element.xml中Ghostable与GhostableInLibrary属性设置
- 关于SQLServer2005的学习笔记——XML的处理
- 【旧】2004-1-28 1:25:59 软件技术前沿:关于XML和RSS(2) ——学习xml--《无废话xml》
- xml学习笔记(4)使用Jaxp对xml文档进行dom解析
- SQL2005中关于XML新特性的学习(1)
- 最近关于mvc,xml,事物的学习笔记
- 关于MSSQL 2000中Select语句FOR XML产生XML文件学习心得
- 关于学习XML
- 关于MSSQL 2000中Select语句FOR XML产生XML文件学习心得
- SQL2005中关于XML新特性的学习(2)--创建XML索引及简单查询
- 关于SQLServer2005的学习笔记——XML的处理
- 对XML文档进行JAXP的DOM解析
- xml学习笔记(6)使用Dom4j对xml文档进行dom解析