日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xml教程之java解析xml文档

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。

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解析器解析到的數據,從而可以決定如何對數據進行處理。

使用SAXParserFactory創建SAX解析工廠 SAXParserFactory spf = SAXParserFactory.newInstance(); 通過SAX解析工廠得到解析器對象 SAXParser sp = spf.newSAXParser(); 通過解析器對象得到一個XML的讀取器 XMLReader xmlReader = sp.getXMLReader(); 設置讀取器的事件處理器 xmlReader.setContentHandler(new BookParserHandler()); 解析xml文件 xmlReader.parse("book.xml");

5、dom4j解析

Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而后獨立開發的。與JDOM不同的是,dom4j使用接口和抽象基類,雖然Dom4j的API相對要復雜一些,但它提供了比JDOM更好的靈活性。
Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j開發,需下載dom4j相應的jar文件。

DOM4j中,獲得Document對象的方式有三種:1.讀取XML文件,獲得document對象 SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml"));2.解析XML形式的文本,得到document對象.String text = "<members></members>"; Document document = DocumentHelper.parseText(text);3.主動創建document對象.Document document = DocumentHelper.createDocument(); //創建根節點Element root = document.addElement("members");

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

package com.sihai.dom4jtest;import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List;import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader;import com.sihai.entity.Book;public class DOM4JTest {private static ArrayList<Book> bookList = new ArrayList<Book>();/*** @param args*/public static void main(String[] args) {// 解析books.xml文件// 創建SAXReader的對象readerSAXReader reader = new SAXReader();try {// 通過reader對象的read方法加載books.xml文件,獲取docuemnt對象。Document document = reader.read(new File("src/res/books.xml"));// 通過document對象獲取根節點bookstoreElement bookStore = document.getRootElement();// 通過element對象的elementIterator方法獲取迭代器Iterator it = bookStore.elementIterator();// 遍歷迭代器,獲取根節點中的信息(書籍)while (it.hasNext()) {System.out.println("=====開始遍歷某一本書=====");Element book = (Element) it.next();// 獲取book的屬性名以及 屬性值List<Attribute> bookAttrs = book.attributes();for (Attribute attr : bookAttrs) {System.out.println("屬性名:" + attr.getName() + "--屬性值:"+ attr.getValue());}Iterator itt = book.elementIterator();while (itt.hasNext()) {Element bookChild = (Element) itt.next();System.out.println("節點名:" + bookChild.getName() + "--節點值:" + bookChild.getStringValue());}System.out.println("=====結束遍歷某一本書=====");}} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

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文档的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。