【Java规划】DOM XML Parser分解、遍历、创XML
1、前言
DOM XML Parser簡介
DOM 它是 W3C 處理 XML 規范 API,這是很多其他的 XML 地基處理相關標準,不僅是 Java,其他的,如 Javascript,PHP。MS .NET 等方面都達到了標準語言。用最為廣泛的 XML 處理方式。當然,為了能提供很多其他更加強大的功能,Java 對于 DOM 直接擴展工具類有非常多,比方非常多 Java 程序猿耳熟能詳的 JDOM。DOM4J 等等,它們基本上屬于對 DOM 接口功能的擴充,保留了非常多 DOM API 的特性。很多原本的 DOM 程序猿甚至都沒有不論什么障礙就熟練掌握了另外兩者的使用,直觀、易于操作的方式使它深受廣大 Java 程序猿的喜愛。
DOM XML Parser優缺點
實現 W3C 標準,有多種編程語言支持這樣的解析方式,而且這樣的方法本身操作上簡單快捷,十分易于剛開始學習的人掌握。其處理方式是將 XML 整個作為類似樹結構的方式讀入內存中以便操作及解析,因此支持應用程序對 XML 數據的內容和結構進行改動,可是同一時候因為其須要在處理開始時將整個 XML 文件讀入到內存中去進行分析,因此其在解析大數據量的 XML 文件時會遇到類似于內存泄露以及程序崩潰的風險,請對這點多加注意。
適用范圍:小型 XML 文件解析、須要全解析或者大部分解析 XML、須要改動 XML 樹內容以生成自己的對象模型
2、XML DOM節點樹
XML DOM將XML文檔作為樹結構,樹結構稱為一個節點樹。全部的節點能夠通過樹訪問,它們的內容能夠被改動或刪除,也能夠建立新的元素。節點樹用于顯示節點集和它們之間的聯系。
下圖呈現的是books.XML文件的節點樹。
經常使用的幾個對象:
1)Element類:
是Node類最基本的子對象。被廣泛使用,在元素中能夠包括屬性。因而Element中有存取其屬性的方法。
2)Node類:
Node對象是DOM中最主要的對象,代表了文檔樹中的抽象節點。但在實際使用中非常少會直接使用Node對象。而是使用Node對象的子對象Element,Attr,Text等。
3)NodeList類:
代表了一個包括一個或者多個Node的列表,依據操作能夠將其簡化的看做為數組。
3、DOM XML Parser 解析XML文件
以下給出一段用于解析的?books.xml片段:
<?xml version="1.0" encoding="UTF-8"?> <!-- Edited by XMLSpy --> <bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="children"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="web"><title lang="en">XQuery Kick Start</title><author>James McGovern</author><author>Per Bothner</author><author>Kurt Cagle</author><author>James Linn</author><author>Vaidyanathan Nagarajan</author><year>2003</year><price>49.99</price></book><book category="web" cover="paperback"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book> </bookstore>
Book.java:該對象是一個實體Bean,其字段信息相應著xml文件中的元素字段,因為篇幅有限,讀者自行生成get、set方法 。
package com.andieguo.xmldemo;public class Book {private String category;private String titleLang;private String title;private String author;private Integer year;private Double price;@Overridepublic String toString() {return "Book [category=" + category + ", titleLang=" + titleLang + ", title=" + title + ", author=" + author + ", year=" + year + ", price=" + price + "]";}//生成字段的get、set方法 }ReadXMLFile.java :解析XML文件并存入List<Book>集合。package com.andieguo.xmldemo;import java.io.File; 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;public class ReadXMLFile {public static void main(String[] args) {File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件應放在和ReadXMLFile.java同級的目錄下List<Book> books = readXMLFile(file);for (Book book : books) {System.out.println(book.toString());}}public static List<Book> readXMLFile(File file) {List<Book> lists = new ArrayList<Book>();try {DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(file);NodeList bookList = doc.getElementsByTagName("book");for (int i = 0; i < bookList.getLength(); i++) {Node bookNode = bookList.item(i);if (bookNode.getNodeType() == Node.ELEMENT_NODE) {Element bookElement = (Element) bookNode;Book book = new Book();book.setCategory(bookElement.getAttribute("category"));Element titleElement = (Element) bookElement.getElementsByTagName("title").item(0);book.setTitle(titleElement.getTextContent());book.setTitleLang(titleElement.getAttribute("lang"));NodeList authorList = bookElement.getElementsByTagName("author");String author = "";for (int j = 0; j < authorList.getLength(); j++) {author = author + authorList.item(j).getTextContent() + "/";}author = author.substring(0, author.length() - 1);book.setAuthor(author);book.setYear(Integer.valueOf(bookElement.getElementsByTagName("year").item(0).getTextContent()));book.setPrice(Double.valueOf(bookElement.getElementsByTagName("price").item(0).getTextContent()));lists.add(book);}}} catch (Exception e) {e.printStackTrace();}return lists;} }執行程序后的效果圖:
4、DOM XML Parser 遍歷XML文件
LoopXMLFile.java:通過迭代遍歷xml文件 package com.andieguo.xmldemo;import java.io.File;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList;public class LoopXMLFile {public static void main(String[] args) {loopXMLFile();}private static void loopXMLFile(){try {File file = new File("src/com/andieguo/xmldemo/books.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(file);if(doc.hasChildNodes()){printNote(doc.getChildNodes());}} catch (Exception e) {e.printStackTrace();}}private static void printNote(NodeList nodeList){for(int i=0; i<nodeList.getLength();i++){Node node = nodeList.item(i);if(node.getNodeType() == Node.ELEMENT_NODE){System.out.println("<"+node.getNodeName()+">");System.out.println(node.getTextContent());if(node.hasAttributes()){NamedNodeMap nodeMap = node.getAttributes();for(int j=0;j<nodeMap.getLength();j++){Node nd = nodeMap.item(j);System.out.println(nd.getNodeName()+"="+nd.getNodeValue());}}if(node.hasChildNodes()){printNote(node.getChildNodes());}System.out.println("<" + node.getNodeName() + "/>");}}} }5、DOM XML Parser 創建XML文件
CreateXMLFile.java:
將集合List<Book>中的數據填充構建的XML文件里,讀者可結合第2節 XML DOM樹圖來理解整個XML文件節點的生成、加入構建過程。
特別注意:
對于XML文件里的元素<year>2500</year>而言。2500不是<year>元素的值,而是<year>元素的一個TextNode節點。所以才有year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));這種語句存在。
package com.andieguo.xmldemo;import java.io.File; import java.util.List;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.w3c.dom.Document; import org.w3c.dom.Element;public class CreateXMLFile {public static void main(String[] args) {File file = new File("src/com/andieguo/xmldemo/books.xml");//books.xml文件應放在和CreateXMLFile.java同級的目錄下List<Book> books = ReadXMLFile.readXMLFile(file);createXMLFile(books);}public static void createXMLFile(List<Book> books) {Document doc;Element bookstore;Element book;Element title;Element author;Element year;Element price;try {// 得到DOM解析器的工廠實例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();// 從DOM工廠中獲得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();// 創建文檔樹模型對象doc = dbBuilder.newDocument();if (doc != null) {bookstore = doc.createElement("bookstore");for (int i = 0; i < books.size(); i++) {book = doc.createElement("book");//設置元素book的屬性值book.setAttribute("category", books.get(i).getCategory());//創建名稱為title的元素title = doc.createElement("title");//創建文本節點并作為子節點加入到title元素中title.appendChild(doc.createTextNode(books.get(i).getTitle()));//設置元素title的屬性值title.setAttribute("lang", books.get(i).getTitleLang());//將title子元素加入到book中book.appendChild(title);String[] strAuthor = books.get(i).getAuthor().split("/");for(int j=0;j<strAuthor.length;j++){author = doc.createElement("author");author.appendChild(doc.createTextNode(strAuthor[j]));book.appendChild(author);//將多個author子元素加入到book中}year = doc.createElement("year");year.appendChild(doc.createTextNode(books.get(i).getYear().toString()));book.appendChild(year);//將year子元素加入到book中price = doc.createElement("price");price.appendChild(doc.createTextNode(books.get(i).getPrice().toString()));book.appendChild(price);//將price子元素加入到book中bookstore.appendChild(book); //將book作為子元素加入到樹的根節點bookstore}doc.appendChild(bookstore);//加入到文檔樹中TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(doc);StreamResult result = new StreamResult(new File("src/com/andieguo/xmldemo/createbooks.xml"));transformer.transform(source, result);}} catch (Exception e) {e.printStackTrace();}} }執行程序后的效果圖:
?參考:
Java 處理 XML 的三種主流技術及介紹
http://www.ibm.com/developerworks/cn/xml/dm-1208gub/
XML DOM Node Tree
http://www.w3schools.com/dom/dom_nodetree.asp
How To Read XML File In Java – (DOM Parser)
http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
How To Create XML File In Java – (DOMParser)
http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/
org.w3c.dom(java dom)解析XML文檔
http://www.cnblogs.com/shenliang123/archive/2012/05/11/2495252.html
友情提示:
轉載請注明出處http://blog.csdn.net/andie_guo/article/details/24844351?。謝略。
版權聲明:本文博主原創文章。博客,未經同意不得轉載。
總結
以上是生活随笔為你收集整理的【Java规划】DOM XML Parser分解、遍历、创XML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++枚举类型
- 下一篇: Android Studio: fini