1 jdom解析xml文档
JDOM是一个开源的,基于Java的库来解析XML文档,这是典型的Java开发人员友好的API。这是java的优化,它使用Java集合像列表和数组。它适用于DOM和SAX API并结合了两个中优点:低内存占用几乎和SAX一样快。当一个JDOM 解析器分析XML文档,可以灵活地得到一个树形结构,其中包含所有文档的元素,而不会影响应用程序的内存占用。JDOM提供了多种可用于检查的情况下的文件的文档的内容和结构的实用功能是良好的结构,其结构是公知的。
2 环境设置
为了使用JDOM解析器,应该有 jdom.jar 在应用程序的类路径中。下载 jdom2.0.6.zip .
3 JDOM 类
JDOM定义了几个Java类。以下是最常见的类:
Document - 表示整个XML文档。文档Document对象是通常被称为DOM树。
Element - 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。
Attribute 表示元素的属性。属性有方法来获取和设置属性的值。它有家长和属性类型。
Text 表示XML标记的文本。
Common 表示一个XML文档中的注释。
4 常见的JDOM方法
使用JDOM,还有会经常用到的几种方法:
SAXBuilder.build(xmlSource)() - 构建XML源的JDOM文档。
Document.getRootElement() - 得到XML的根元素。
Element.getName() - 获取XML节点的名称。
Element.getChildren() - 得到一个元素的所有直接子节点。
Node.getChildren(Name) - 获得具有给定名称的直接子节点。
Node.getChild(Name) - 获取使用给定名称的第一个孩子节点。
5 要解析的xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title>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>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
6 解析代码
实体类
Book.java
package com.wnq.sk.jdomXML01;
public class Book
{
// 与books.xml中的节点对应
private String category;
private String titleLang;
private String title;
private String author;
private Integer year;
private Double price;
public String getCategory()
{
return category;
}
public void setCategory(String category)
{
this.category = category;
}
public String getTitleLang()
{
return titleLang;
}
public void setTitleLang(String titleLang)
{
this.titleLang = titleLang;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public Integer getYear()
{
return year;
}
public void setYear(Integer year)
{
this.year = year;
}
public Double getPrice()
{
return price;
}
public void setPrice(Double price)
{
this.price = price;
}
public String toString()
{
return "Book [category=" + category + ", titleLang=" + titleLang + ", title=" + title + ", author=" + author
+ ", year=" + year + ", price=" + price + "]";
}
}
解析类
JdomReadXMLFile.java
package com.wnq.sk.jdomXML01;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
/**
* @author liandong
*/
public class JdomReadXMLFile
{
public static void main(String[] args)
throws Exception, Exception
{
List<Book> books = jdomReadXMLFile("books.xml");
for (Book b : books)
{
System.out.println(b.toString());
}
}
public static List<Book> jdomReadXMLFile(String fileName)
throws Exception, IOException
{
List<Book> books = new ArrayList<Book>();
Book book = null;
List<Element> authorList = null;
// 创建DocmentBulider
SAXBuilder saxBuilder = new SAXBuilder();
// 从文件或流创建一个文档
Document document = saxBuilder.build(fileName);
// 提取根元素
Element rootElement = document.getRootElement();
// 检查属性
List<Element> bookElementList = rootElement.getChildren();
// 检查子元素
for (int i = 0; i < bookElementList.size(); i++)
{
book = new Book();
authorList = new ArrayList<Element>();
Element bookElement = bookElementList.get(i);// book节点
// 得到book的category属性
String category = bookElement.getAttributeValue("category");
book.setCategory(category);
Element titleElement = bookElement.getChild("title");
String titleLang = titleElement.getAttributeValue("lang");
book.setTitleLang(titleLang);
String title = titleElement.getText();
book.setTitle(title);
// author 可能有多个
authorList = bookElement.getChildren("author");
String author = "";
for (int j = 0; j < authorList.size(); j++)
{
author = author + authorList.get(j).getText() + "/";
}
book.setAuthor(author);
String year = bookElement.getChild("year").getText();
book.setYear(Integer.valueOf(year));
String price = bookElement.getChild("price").getText();
book.setPrice(Double.valueOf(price));
books.add(book);
}
return books;
}
}
解析结果: