1、Book类
public class Book {
private int id;
private String name;
private float price;
public Book() {
// TODO 自动生成的构造函数存根
}
public Book(int id, String name, float price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", price=" + price
+ "]";
}
}
2、HttpUtil类
public class httpUtils {
public httpUtils() {
// TODO 自动生成的构造函数存根
}
public static InputStream getXML(String path){
InputStream inputStream = null;
try {
URL url = new URL(path);
if(url != null){
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if(code == 200){
inputStream = connection.getInputStream();
}
}
} catch (Exception e) {
// TODO: handle exception
}
return inputStream;
}
}
3、解析实体类
public class DomService {
public DomService() {
// TODO 自动生成的构造函数存根
}
public List<Book> getBooks(InputStream inputStream) throws ParserConfigurationException, SAXException, IOException{
List<Book> list = new ArrayList<Book>();
//创建一个document解析的工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
Element element = document.getDocumentElement();//得到稳定的元素节点
NodeList bookNodes = element.getElementsByTagName("book");
for(int i = 0; i<bookNodes.getLength(); i++){
Element bookElement = (Element) bookNodes.item(i);
Book book = new Book();
book.setId(Integer.parseInt(bookElement.getAttribute("id")));
NodeList childNodes = bookElement.getChildNodes();// 遍历根节点下的子节点
for(int j = 0; j<childNodes.getLength();j++){
if(childNodes.item(j).getNodeType() == Node.ELEMENT_NODE){
if("name".equals(childNodes.item(j).getNodeName())){
book.setName(childNodes.item(j).getFirstChild().getNodeValue());
} else if("price".equals(childNodes.item(j).getNodeName())){
book.setPrice(Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));
}
}
}
list.add(book);
}
return list;
}
public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException{
String path = "http://192.168.0.102:8080/MyHttp/book.xml";
InputStream inputStream = httpUtils.getXML(path);
DomService service = new DomService();
List<Book> list = service.getBooks(inputStream);
for(Book book:list){
System.out.println(book.toString());
}
}
}
/*输出结果:
* [id = 12, name = thinking in java, price = 85.5]
* [id = 15, name = Spring in Action, price = 39.0]
*
* DOM解析XML文件相比其他两种解析方式,效率低下,
* 如果当前如果有很多个子节点,再取一次字节点,所以效率比较低,所以一般使用的时候比较少
* */
/*=========SAX、DOM和PULL的比较
* 从内存占用率来说:SAX和PULL比DOM占用更少的内存解析方式,更加适合Android 开发
*
*
* */