您的位置:首页 > 编程语言 > Java开发

java如何解析xml文件(上)

2016-11-21 16:57 281 查看
周末回去学习了一下xml文件是如何解析的,  主流的方法有四种,即:DOM、SAX、JDOM和DOM4J.

下面是我写的一个xml文件:books.xml

<bookstore>
<book id="1">
<name>莽荒纪name>
<author>我吃西红
4000
柿author>
<year>2014year>
<price>88price>
book>
<book id="2">
<name>完美世界name>
<author>辰东author>
<year>2015year>
<language>中文language>
book>
bookstore>

一  、使用DOM解析XML文件

【优点】

      ①允许应用程序对数据和结构做出更改。

      ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。

【缺点】

      ①通常需要加载整个XML文档来构造层次结构,消耗资源大。

package club.itstu.xml_dom;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
* @author wx
* 2016年11月13日
*/
public class XMLDomDemo {
public static void main(String[] args) {
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//创建一个DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的parse方法加载books.xml文件到当前项目下
Document document = db.parse("books.xml");
//获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book");
//获取bookList的长度
System.out.println("一共有"+bookList.getLength()+"本书");
//遍历每一个book节点
for(int i=0;i"---------下面开始遍历第"+(i+1)+"本书:  ");
//通过item()获取每一个book节点
Node book = bookList.item(i);
//获取book节点的所有属性集合
NamedNodeMap attrs = book.getAttributes();
System.out.println("第"+(i+1)+"本书一共有"+attrs.getLength()+"个属性");
//遍历book的属性
for(int j=0;j//通过item()方法获取每一个属性
Node attr = attrs.item(j);
System.out.println("属性名:"+attr.getNodeName());
System.out.println("--属性值:"+attr.getNodeValue());

}
//获取book节点的所有子节点
NodeList childNodes = book.getChildNodes();
//获取子节点的个数
System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子节点");
//遍历所有子节点
for(int j=0;j//区分出text类型的节点以及element类型的节点
if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
System.out.print(childNodes.item(j).getNodeName());
System.out.println("--"+childNodes.item(j).getTextContent());

}
}
System.out.println("第"+(i+1)+"本书遍历完毕---------");
}

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


二 、使用SAX解释XML文件

【优势】

     ①不需要等待所有数据都被处理,分析就能立即开始。

     ②只在读取数据时检查数据,不需要保存在内存中。

     ③可以在某个条件得到满足时停止解析,不必解析整个文档。

     ④效率和性能较高,能解析大于系统内存的文档。

【缺点】

     ①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。

     ②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。

package club.itstu.xml_sax;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

/**
* @author wx
* 2016年11月13日
*/
public class SAXDemo {
public static void main(String[] args) {
//获取SAXParserFactory的实例
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//通过factory获取SAXParser的实例
SAXParser parse = factory.newSAXParser();
//创建SAXParsrHandler实例
SAXParsrHandler handle = new SAXParsrHandler();
parse.parse("books.xml", handle);
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


package club.itstu.xml_sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
* @author wx
* 2016年11月13日
*/
public class SAXParsrHandler extends DefaultHandler {
int bookIndex = 0;//判断是第几本书

public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析开始");
}

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//开始解析book元素的属性
if(qName.equals("book")){
bookIndex++;
System.out.println("----------开始遍历第"+bookIndex+"本书内容----------");
/*
//已知book元素下的属性名称,通过属性名获取属性值
String value = attributes.getValue("id");
System.out.println("book的属性值是: "+value);*/
//不知道book元素下的属性名,循环遍历属性
for(int i=0;i"第"+(i+1)+"个属性名:"+attributes.getQName(i));
System.out.println("---属性值为:"+attributes.getValue(i));
}
}else if(!qName.equals("book")&&!qName.equals("bookstore")){
System.out.print("节点名: "+qName);
}
}

public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if(qName.equals("book")){
System.out.println("----------结束遍历第"+bookIndex+"本书内容----------");
}
}

public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析结束");
}

public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String value = new String(ch, start, length);
if(!value.trim().equals("")){
System.out.println("---"+value);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: