xml教程之java解析xml文档
1、java解析xml文件介紹
XML解析方式分為兩種:DOM方式和SAX方式
DOM:Document Object Model,文檔對象模型。這種方式是W3C推薦的處理XML的一種方式。
SAX:Simple API for XML。這種方式不是官方標準,屬于開源社區XML-DEV,幾乎所有的XML解析器都支持它。
XML解析開發包
JAXP:是SUN公司推出的解析標準實現。
Dom4J:是開源組織推出的解析開發包。(牛,大家都在用,包括SUN公司的一些技術的實現都在用)
JDom:是開源組織推出的解析開發包。
2、jaxp
JAXP:(Java API for XML Processing)開發包是JavaSE的一部分,它由以下幾個包及其子包組成:
org.w3c.dom:提供DOM方式解析XML的標準接口
org.xml.sax:提供SAX方式解析XML的標準接口
javax.xml:提供了解析XML文檔的類
javax.xml.parsers包中,定義了幾個工廠類。我們可以通過調用這些工廠類,得到對XML文檔進行解析的DOM和SAX解析器對象。
DocumentBuilderFactory
SAXParserFactory
3、dom編程
DOM模型(document object model)
DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關系,解析成一個個Node對象(節點)。
在dom中,節點之間關系如下:
位于一個節點之上的節點是該節點的父節點(parent)
一個節點之下的節點是該節點的子節點(children)
同一層次,具有相同父節點的節點是兄弟節點(sibling)
一個節點的下一個層次的節點集合是節點后代(descendant)
父、祖父節點及所有位于節點上面的,都是節點的祖先(ancestor)
節點類型(下頁ppt)
4、sax解析
在使用 DOM 解析 XML 文檔時,需要讀取整個 XML 文檔,在內存中構架代表整個 DOM 樹的Doucment對象,從而再對XML文檔進行操作。此種情況下,如果 XML 文檔特別大,就會消耗計算機的大量內存,并且容易導致內存溢出。
SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才會文檔進行操作。
SAX采用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器和事件處理器:
解析器可以使用JAXP的API創建,創建出SAX解析器后,就可以指定解析器去解析某個XML文檔。
解析器采用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作為方法的參數傳遞給事件處理器。
事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕松地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理。
5、dom4j解析
Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而后獨立開發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要復雜一些,但它提供了比JDOM更好的靈活性。
Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j開發,需下載dom4j相應的jar文件。
5.1、節點對象
1.獲取文檔的根節點.
Element root = document.getRootElement();
2.取得某個節點的子節點.
Element element=node.element(“書名");
3.取得節點的文字
String text=node.getText();
4.取得某節點下所有名為“member”的子節點,并進行遍歷. List nodes = rootElm.elements(“member”); for (Iterator it = nodes.iterator(); it.hasNext()😉 { Element elm = (Element) it.next(); // do something }
5.對某節點下的所有子節點進行遍歷. for(Iterator it=root.elementIterator();it.hasNext()😉{ Element element = (Element) it.next(); // do something }
6.在某節點下添加子節點.Element ageElm = newMemberElm.addElement(“age”);
7.設置節點文字. element.setText(“29”);
8.刪除某節點.//childElm是待刪除的節點,parentElm是其父節點
parentElm.remove(childElm);
9.添加一個CDATA節點.Element contentElm = infoElm.addElement(“content”);contentElm.addCDATA(diary.getContent());
5.2、節點對象屬性
1.取得某節點下的某屬性 Element root=document.getRootElement(); //屬性名name
Attribute attribute=root.attribute(“size”);
2.取得屬性的文字 String text=attribute.getText();
3.刪除某屬性 Attribute attribute=root.attribute(“size”); root.remove(attribute);
3.遍歷某節點的所有屬性 Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext()😉{ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); }
4.設置某節點的屬性和文字. newMemberElm.addAttribute(“name”, “sitinspring”);
5.設置屬性的文字 Attribute attribute=root.attribute(“name”); attribute.setText(“sitinspring”);
5.3、寫入xml
1.文檔中全為英文,不設置編碼,直接寫入的形式. XMLWriter writer = new XMLWriter(new FileWriter(“output.xml”)); writer.write(document); writer.close();
2.文檔中含有中文,設置編碼格式寫入的形式.OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML編碼
format.setEncoding(“GBK”); XMLWriter writer = new XMLWriter(new FileOutputStream (“output.xml”),format);writer.write(document);writer.close();
5.4、字符串和xml轉換
1.將字符串轉化為XML String text = "<members> <member>sitinspring</member></members>";Document document = DocumentHelper.parseText(text);2.將文檔或節點的XML轉化為字符串.SAXReader reader = new SAXReader();Document document = reader.read(new File("input.xml")); Element root=document.getRootElement(); String docXmlText=document.asXML(); String rootXmlText=root.asXML();Element memberElm=root.element("member");String memberXmlText=memberElm.asXML();實例:
jar:dom4j.jar
2、jdom解析
package com.sihai.jdomtest;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List;import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder;import com.sihai.entity.Book;public class JDOMTest {private static ArrayList<Book> booksList = new ArrayList<Book>();/*** @param args*/public static void main(String[] args) {// 進行對books.xml文件的JDOM解析// 準備工作// 1.創建一個SAXBuilder的對象SAXBuilder saxBuilder = new SAXBuilder();InputStream in;try {// 2.創建一個輸入流,將xml文件加載到輸入流中in = new FileInputStream("src/res/books.xml");InputStreamReader isr = new InputStreamReader(in, "UTF-8");// 3.通過saxBuilder的build方法,將輸入流加載到saxBuilder中Document document = saxBuilder.build(isr);// 4.通過document對象獲取xml文件的根節點Element rootElement = document.getRootElement();// 5.獲取根節點下的子節點的List集合List<Element> bookList = rootElement.getChildren();// 繼續進行解析for (Element book : bookList) {Book bookEntity = new Book();System.out.println("======開始解析第" + (bookList.indexOf(book) + 1)+ "書======");// 解析book的屬性集合List<Attribute> attrList = book.getAttributes();// //知道節點下屬性名稱時,獲取節點值// book.getAttributeValue("id");// 遍歷attrList(針對不清楚book節點下屬性的名字及數量)for (Attribute attr : attrList) {// 獲取屬性名String attrName = attr.getName();// 獲取屬性值String attrValue = attr.getValue();System.out.println("屬性名:" + attrName + "----屬性值:"+ attrValue);if (attrName.equals("id")) {bookEntity.setId(attrValue);}}// 對book節點的子節點的節點名以及節點值的遍歷List<Element> bookChilds = book.getChildren();for (Element child : bookChilds) {System.out.println("節點名:" + child.getName() + "----節點值:"+ child.getValue());if (child.getName().equals("name")) {bookEntity.setName(child.getValue());}else if (child.getName().equals("author")) {bookEntity.setAuthor(child.getValue());}else if (child.getName().equals("year")) {bookEntity.setYear(child.getValue());}else if (child.getName().equals("price")) {bookEntity.setPrice(child.getValue());}else if (child.getName().equals("language")) {bookEntity.setLanguage(child.getValue());}}System.out.println("======結束解析第" + (bookList.indexOf(book) + 1)+ "書======");booksList.add(bookEntity);bookEntity = null;System.out.println(booksList.size());System.out.println(booksList.get(0).getId());System.out.println(booksList.get(0).getName());}} catch (FileNotFoundException e) {e.printStackTrace();} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}3、sax方式解析
package com.sihai.test;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.xml.sax.SAXException; import org.xml.sax.SAXParseException;import com.sihai.entity.Book; import com.sihai.handler.SAXParserHandler;public class SAXTest {/*** @param args*/public static void main(String[] args) {//錕斤拷取一錕斤拷SAXParserFactory錕斤拷實錕斤拷SAXParserFactory factory = SAXParserFactory.newInstance();//通錕斤拷factory錕斤拷取SAXParser實錕斤拷try {SAXParser parser = factory.newSAXParser();//錕斤拷錕斤拷SAXParserHandler錕斤拷錕斤拷SAXParserHandler handler = new SAXParserHandler();parser.parse("books.xml", handler);System.out.println("~!~!~!共有" + handler.getBookList().size()+ "本書");for (Book book : handler.getBookList()) {System.out.println(book.getId());System.out.println(book.getName());System.out.println(book.getAuthor());System.out.println(book.getYear());System.out.println(book.getPrice());System.out.println(book.getLanguage());System.out.println("----finish----");}} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}4、四種方式比較
package com.parser.test;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Iterator; import java.util.List;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory;import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.jdom2.Attribute; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException;import com.sihai.entity.Book; import com.sihai.handler.SAXParserHandler;public class ParseTest {public void domXmlParser() {ArrayList<Book> bookLists = new ArrayList<Book>();DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();try {DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse("books.xml");NodeList bookList = document.getElementsByTagName("book");for (int i = 0; i < bookList.getLength(); i++) {Node book = bookList.item(i);Book bookEntity = new Book();NamedNodeMap attrs = book.getAttributes();for (int j = 0; j < attrs.getLength(); j++) {Node attr = attrs.item(j);if (attr.getNodeName().equals("id")) {bookEntity.setId(attr.getNodeValue());}}NodeList childNodes = book.getChildNodes();for (int k = 0; k < childNodes.getLength(); k++) {if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {String name = childNodes.item(k).getNodeName();String value = childNodes.item(k).getFirstChild().getNodeValue();if (name.equals("name")) {bookEntity.setName(value);}else if (name.equals("author")) {bookEntity.setAuthor(value);}else if (name.equals("year")) {bookEntity.setYear(value);}else if (name.equals("price")) {bookEntity.setPrice(value);}else if (name.equals("language")) {bookEntity.setLanguage(value);}}}bookLists.add(bookEntity);bookEntity = null;}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void saxXmlParser(){SAXParserFactory factory = SAXParserFactory.newInstance();try {SAXParser parser = factory.newSAXParser();SAXParserHandler handler = new SAXParserHandler();parser.parse("books.xml", handler);} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void jdomXmlParser() {ArrayList<Book> booksList = new ArrayList<Book>();SAXBuilder saxBuilder = new SAXBuilder();InputStream in;try {in = new FileInputStream("books.xml");InputStreamReader isr = new InputStreamReader(in, "UTF-8");org.jdom2.Document document = saxBuilder.build(isr);org.jdom2.Element rootElement = document.getRootElement();List<org.jdom2.Element> bookList = rootElement.getChildren();for (org.jdom2.Element book : bookList) {Book bookEntity = new Book();List<Attribute> attrList = book.getAttributes();for (Attribute attr : attrList) {String attrName = attr.getName();String attrValue = attr.getValue();if (attrName.equals("id")) {bookEntity.setId(attrValue);}}List<org.jdom2.Element> bookChilds = book.getChildren();for (org.jdom2.Element child : bookChilds) {if (child.getName().equals("name")) {bookEntity.setName(child.getValue());}else if (child.getName().equals("author")) {bookEntity.setAuthor(child.getValue());}else if (child.getName().equals("year")) {bookEntity.setYear(child.getValue());}else if (child.getName().equals("price")) {bookEntity.setPrice(child.getValue());}else if (child.getName().equals("language")) {bookEntity.setLanguage(child.getValue());}}booksList.add(bookEntity);bookEntity = null;}} catch (FileNotFoundException e) {e.printStackTrace();} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void dom4jXmlParser(){ArrayList<Book> booksList = new ArrayList<Book>();SAXReader reader = new SAXReader();try {org.dom4j.Document document = reader.read(new File("books.xml"));org.dom4j.Element bookStore = document.getRootElement();List<org.dom4j.Element> bookEles = bookStore.elements();for (org.dom4j.Element book : bookEles) {Book bookEntity = new Book();List<org.dom4j.Attribute> bookAttrs = book.attributes();for (org.dom4j.Attribute attr : bookAttrs) {if (attr.getName().equals("id")) {bookEntity.setId(attr.getValue());}}List<org.dom4j.Element> bookss = book.elements();for (org.dom4j.Element bookChild : bookss) {String name = bookChild.getName();String value = bookChild.getStringValue();if (name.equals("name")) {bookEntity.setName(value);}else if (name.equals("author")) {bookEntity.setAuthor(value);}else if (name.equals("year")) {bookEntity.setYear(value);}else if (name.equals("price")) {bookEntity.setPrice(value);}else if (name.equals("language")) {bookEntity.setLanguage(value);}}booksList.add(bookEntity);bookEntity = null;}} catch (DocumentException e) {e.printStackTrace();}}@Testpublic void testPerformance() throws Exception{System.out.println("性能測試:");//測試DOM的性能:long start = System.currentTimeMillis();domXmlParser();System.out.println("DOM:"+ (System.currentTimeMillis() - start) );//測試SAX的性能:start = System.currentTimeMillis();saxXmlParser();System.out.println("SAX:"+ (System.currentTimeMillis() - start) );//測試JDOM的性能:start = System.currentTimeMillis();jdomXmlParser();System.out.println("JDOM:"+ (System.currentTimeMillis() - start) );//測試DOM4J的性能:start = System.currentTimeMillis();dom4jXmlParser();System.out.println("DOM4J:"+ (System.currentTimeMillis() - start) );} }總結
以上是生活随笔為你收集整理的xml教程之java解析xml文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat和http简介
- 下一篇: Apache FileUpload介绍