JDOM解析原理:
1.(转移项目时夹包不会移动)导入夹包Build Path-》add external archives-》jdom-2.0.jar以上
2.一起移动的方法,项目中创建一个文件夹lib,然后将jar包复制进去,之后按1中的操作进行
org.jdom2的document对象
首先也要创建一个book类:
结果:
======开始解析第1书======
属性名:id----属性值:1
节点名:name----节点值:冰与火之歌
节点名:author----节点值:乔治马丁
节点名:year----节点值:2014
节点名:price----节点值:89
======结束解析第1书======
1
1
冰与火之歌
======开始解析第2书======
属性名:id----属性值:2
节点名:name----节点值:安徒生童话
节点名:year----节点值:2004
节点名:price----节点值:77
节点名:language----节点值:English
======结束解析第2书======
2
1
冰与火之歌
DOM4J解析原理:
导入jar包:dom4j-1.6.1.jar
结果:
=====开始遍历某一本书=====
属性名:id--属性值:1
节点名:name--节点值:冰与火之歌
节点名:author--节点值:乔治马丁
节点名:year--节点值:2014
节点名:price--节点值:89
=====结束遍历某一本书=====
=====开始遍历某一本书=====
属性名:id--属性值:2
节点名:name--节点值:安徒生童话
节点名:year--节点值:2004
节点名:price--节点值:77
节点名:language--节点值:English
=====结束遍历某一本书=====
DOM和SAX
DOM优点:
形成了树结构,直观好理解,代码更易编写
解析过程中树结构保留在内存中,方便修改
缺点
当XML文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出
SAX
优点:
事件驱动模式,对内存耗费比较小
适用于只需要处理xml中数据时
缺点:
不易编码
很难同时访问同一个XML中的多处不同的数据
JDOM与DOM,DOM4J
JDOM:仅使用具体类而不是使用接口
api大量使用了collections类
DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文件的表示方法
具有性能优异,灵活性好,功能强大,极端易使用的特点
DOM《SAX DOM4J》JDOM,xml非常大非官方的方法远好于官方方法
1.(转移项目时夹包不会移动)导入夹包Build Path-》add external archives-》jdom-2.0.jar以上
2.一起移动的方法,项目中创建一个文件夹lib,然后将jar包复制进去,之后按1中的操作进行
org.jdom2的document对象
首先也要创建一个book类:
public class JDOMTest {
private static ArrayList booksList = new ArrayList();
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 bookList = rootElement.getChildren();
// 继续进行解析
for (Element book : bookList) {
Book bookEntity = new Book();
System.out.println("======开始解析第" + (bookList.indexOf(book) + 1)
+ "书======");
// 解析book的属性集合
List 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 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();
}
}
结果:
======开始解析第1书======
属性名:id----属性值:1
节点名:name----节点值:冰与火之歌
节点名:author----节点值:乔治马丁
节点名:year----节点值:2014
节点名:price----节点值:89
======结束解析第1书======
1
1
冰与火之歌
======开始解析第2书======
属性名:id----属性值:2
节点名:name----节点值:安徒生童话
节点名:year----节点值:2004
节点名:price----节点值:77
节点名:language----节点值:English
======结束解析第2书======
2
1
冰与火之歌
DOM4J解析原理:
导入jar包:dom4j-1.6.1.jar
然后:
public class DOM4JTest {
private static ArrayList bookList = new ArrayList();
public static void main(String[] args) {
// 解析books.xml文件
// 创建SAXReader的对象reader
SAXReader reader = new SAXReader();
try {
// 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
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()) {
System.out.println("=====开始遍历某一本书=====");
Element book = (Element) it.next();
// 获取book的属性名以及 属性值
List 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 block
e.printStackTrace();
}
}
结果:
=====开始遍历某一本书=====
属性名:id--属性值:1
节点名:name--节点值:冰与火之歌
节点名:author--节点值:乔治马丁
节点名:year--节点值:2014
节点名:price--节点值:89
=====结束遍历某一本书=====
=====开始遍历某一本书=====
属性名:id--属性值:2
节点名:name--节点值:安徒生童话
节点名:year--节点值:2004
节点名:price--节点值:77
节点名:language--节点值:English
=====结束遍历某一本书=====
DOM和SAX
DOM优点:
形成了树结构,直观好理解,代码更易编写
解析过程中树结构保留在内存中,方便修改
缺点
当XML文件较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出
SAX
优点:
事件驱动模式,对内存耗费比较小
适用于只需要处理xml中数据时
缺点:
不易编码
很难同时访问同一个XML中的多处不同的数据
JDOM与DOM,DOM4J
JDOM:仅使用具体类而不是使用接口
api大量使用了collections类
DOM4J:JDOM的一种智能分支,它合并了许多超出基本XML文件的表示方法
具有性能优异,灵活性好,功能强大,极端易使用的特点
DOM《SAX DOM4J》JDOM,xml非常大非官方的方法远好于官方方法