java中導入org.jdom.Document和org.dom4j.Document沖突
請各位大神解惑,dom4j和jdom無法同時運行,jdom中引用的Document和Element都顯示屬于dom4j包中,同時導入org.jdom.Document和org.dom4j.Document報錯
代碼如下:
package com.imooc.parsertest;
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.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
//import org.jdom.Attribute;
//import org.jdom.Element;
import com.imooc.entity.Book;
import com.imooc.handler.SAXParserHandler;
import org.junit.Test;
public class ParserTest {
public void dom4jTest(){
ArrayList<Book> booksList = new ArrayList<Book>();
// 解析books.xml文件
//創建SAXReader的對象reader
SAXReader reader = new SAXReader();
try {
//通過reader對象的read方法加載xml文件,獲取document對象
Document document = reader.read(new File("src/res/books.xml"));
//通過document對象獲取根節點bookstore
Element bookStore = document.getRootElement();
//通過element對象的elementIterator方法獲取迭代器
Iterator it = bookStore.elementIterator();
//遍歷迭代器,獲取根節點中的信息(書籍)
while(it.hasNext()){
Book books = new Book();
int i = 1;
// 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());
if(attr.getName().equals("id")){
books.setId(attr.getValue());
}
}
//通過element對象的elementIterator方法獲取迭代器
Iterator itt = book.elementIterator();
//遍歷迭代器,獲取子節點中的信息
while(itt.hasNext()){
Element bookChild = (Element)itt.next();
// System.out.println("節點名:" + bookChild.getName() + "--節點值:" + bookChild.getStringValue());
if(bookChild.getName().equals("name")){
books.setName(bookChild.getStringValue());
}
else if(bookChild.getName().equals("author")){
books.setAuthor(bookChild.getStringValue());
}
else if(bookChild.getName().equals("year")){
books.setYear(bookChild.getStringValue());
}
else if(bookChild.getName().equals("price")){
books.setPrice(bookChild.getStringValue());
}
else if(bookChild.getName().equals("language")){
books.setLanguage(bookChild.getStringValue());
}
}
i++;
// System.out.println("=====結束遍歷某一本書=====");
booksList.add(books);
books = null;
if(i == booksList.size()){
for(Book booksl : booksList){
// System.out.println("-----開始遍歷-----");
// System.out.println(booksl.getId());
// System.out.println(booksl.getName());
// System.out.println(booksl.getAuthor());
// System.out.println(booksl.getYear());
// System.out.println(booksl.getPrice());
// System.out.println(booksl.getLanguage());
// System.out.println("-----結束遍歷-----");
}
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void domTest(){
// 創建一個DocumentBuilderFactory的對象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//創建一個DocumentBuilder的對象
try {
DocumentBuilder db = dbf.newDocumentBuilder();
//通過DocumentBuilder對象的parser方法加載books.xml文件到當前項目下
org.w3c.dom.Document document = db.parse("books.xml");
//獲取所有book節點的集合
NodeList bookList = document.getElementsByTagName("book");
//通過nodelist的getLength()方法可以獲取bookList的長度
// System.out.println("一共有" + bookList.getLength() + "本書");
//遍歷每一個book節點
for(int i = 0;i < bookList.getLength();i++){
// System.out.println("下面開始遍歷第" + (i+1) + "本書的內容");
//通過item(i)方法 獲取一個book節點 nodelist的索引值從0開始
Node book = bookList.item(i);
//獲取book節點的所有屬性集合
NamedNodeMap attrs = book.getAttributes();
// System.out.println("第" + (i+1) + "本書" + attrs.getLength() + "個屬性");
//遍歷book的屬性
for(int j = 0; j < attrs.getLength(); j++){
//通過item(index)方法獲取book節點的某一屬性
Node attr = attrs.item(j);
//獲取屬性名
// System.out.println("屬性名:" + attr.getNodeName());
// //獲取屬性值
// System.out.println("屬性值" + attr.getNodeValue());
}
//前提: 已經知道book節點有且只有一個id屬性
// //將book節點進行強制類型轉換,轉換成Element類型
// Element book = (Element)bookList.item(i);
// //通過getAttribute("id")方法獲取屬性值
// String s = book.getAttribute("id");
// System.out.println("id的屬性值為:" + s);
//解析book節點的子節點
NodeList childNodes = book.getChildNodes();
//遍歷childNodes獲取每個節點的節點名和節點值
// System.out.println("第" + (i+1) + "本書共有" + childNodes.getLength() + "個子節點");
for(int k = 0; k < childNodes.getLength(); k++){
//區分出text類型的node以及element類型的node
if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
//獲取了element類型節點的節點名
// System.out.println(childNodes.item(k).getNodeName());
// //獲取element類型節點的節點值
//// System.out.println(childNodes.item(k).getFirstChild().getNodeValue());
// System.out.println(childNodes.item(k).getTextContent());
}
}
// System.out.println("下面結束遍歷第" + (i+1) + "本書的內容");
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void jdomTest(){
ArrayList<Book> booksList = new ArrayList<Book>();
// 進行對books.xml文件的JDOM解析
//準備工作?
//1.創建一個SAXBuileder的對象
SAXBuilder saxBuilder = new SAXBuilder();
//2.創建一個輸入流
InputStream in;
try {
//將xml文件加載到輸入流中來
in = new FileInputStream("src/res/books.xml");
//創建一個InputStreamReader對象并聲明轉換后的編碼格式
// InputStreamReader isr = new InputStreamReader(in, "UTF-8");
//3.通過saxBuilder的build方法,將輸入流加載到saxBuilder中
org.jdom.Document document = saxBuilder.build(in);
//4.通過document對象獲取xml文件的根節點
org.jdom.Element rootElement = document.getRootElement();
//5.獲取根節點下的子節點的List集合
List<Element> bookList = rootElement.getChildren();
int i = 0;//定義一個變量用于比較根節點下子節點個數
//繼續進行解析
for(Element book : bookList){
//新建book對象
Book bookEntity = new Book();
// System.out.println("=====開始解析第" + (bookList.indexOf(book) + 1) +"書======");
//解析book的屬性
List<Attribute> attrList = ((org.jdom.Element) book).getAttributes();
// //知道節點下屬性名稱時,獲取節點值
// System.out.println(book.getAttributeValue("id"));
//遍歷attrList(針對不清楚book節點下屬性的名字及屬性)
for(Attribute attr : attrList){
//獲取屬性名
String attrName = attr.getName();
//獲取屬性值
String attrValue = attr.getValue();
// System.out.println("屬性名:" + attrName + "---屬性值:" + attrValue);
//賦值book的id屬性
if(attrName.equals("id")){
bookEntity.setId(attrValue);
}
}
//對book節點的子節點的節點名和節點值的遍歷
List<Element> bookChilds = ((org.jdom.Element) book).getChildren();
for(Element child : bookChilds){
// System.out.println("節點名:" + child.getName() + "---節點值:" + child.getStringValue());
// //通過判斷循給對應屬性賦值
if(child.getName().equals("name")){
bookEntity.setName(child.getStringValue());
}
else if(child.getName().equals("author")){
bookEntity.setAuthor(child.getStringValue());
}
else if(child.getName().equals("year")){
bookEntity.setYear(child.getStringValue());
}
else if(child.getName().equals("price")){
bookEntity.setPrice(child.getStringValue());
}
else if(child.getName().equals("language")){
bookEntity.setLanguage(child.getStringValue());
}
}
// System.out.println("=====結束解析第" + (bookList.indexOf(book) + 1) +"書======");
i++;
//將bookEntity對象存入booksList集合中
booksList.add(bookEntity);
bookEntity = null;//清空緩存,再次接收數據
if(i == bookList.size()){//判斷xml中book對象全部插入集合后再輸出
//遍歷輸出booksList集合中存入的數據
for(Book books : booksList){
// System.out.println(books.getId());
// System.out.println(books.getName());
// if(!(books.getAuthor() == null)){
// System.out.println(books.getAuthor());
// }
// System.out.println(books.getYear());
// System.out.println(books.getPrice());
// if(!(books.getLanguage() == null)){
// System.out.println(books.getLanguage());
// }
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void saxTest(){
try {
//獲取一個SAXParserFactory的實例
SAXParserFactory factory = SAXParserFactory.newInstance();
//通過factory獲取SAXParser實例
SAXParser parser = factory.newSAXParser();
//創建SAXParserHandler對象
SAXParserHandler handler = new SAXParserHandler();
//調用parser的parse方法解析xml文件
parser.parse("books.xml", handler);
//輸出bookList數組中保存的book對象個數
// System.out.println("---共有" + handler.getBookList().size() + "本書!");
for(Book book : handler.getBookList()){//遍歷循環輸出每個book對象的每個屬性
// 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 block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testPerformance() throws Exception{
System.out.println("---性能測試---");
long start = System.currentTimeMillis();
dom4jTest();
System.out.println("dom4j時長:" + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
domTest();
System.out.println("dom時長:" + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
saxTest();
System.out.println("sax時長:" + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
jdomTest();
System.out.println("jdom時長:" + (System.currentTimeMillis() - start));
}
}
2018-06-10
jdom和dom4j其中一個的包正常導入 另一個要加上類所在的包名
像這樣
2017-08-03
因為幾個方法里都有Document對象,系統認為他們是同一個包里的同一種Document對象,所以創建時應該加上該Document類所在的包名,如org.w3c.dom.Document document = db.parse("book.xml")或
org.dom4j.Document?document = reader.read("res/book.xml");或
org.jdom2.Document?document = saxbuilder.build(isr);,這樣就不會出錯了