目前流行的4种解析XML的方式:
基础解析方式(JAVA本身提供的解析方式,官方支持):
1.DOM解析(与平台无关的官方解析方式)
2.SAX解析(基于事件驱动的解析方式)
扩展方法(只能在JAVA平台上使用):
3.JDOM解析
4.DOM4J解析
各种解析方法实现:
1.DOM解析
/*
DOM解析需要通过DocumentBuilder的parse(xmlFileName)将xml文件加载带Document,以下代码可以完成加载:
*/
/*创建DocumentBuilderFactory实例*/
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
/*通过DocumentBuilderFactory的newDocumentBuilder方法创建DocumentBuilder对象*/
DocumentBuilder db = dbf.newDocumentBuilder();
/* //通过DocumentBuilder的parse方法读取文件到document*/
Document document = db.parse("xmlFileName.xml");
/*
通过Document的getElementsByTagName("nodeName")获得xml文件中根目录所有节点名为nodeName的节点,返回值是一个NodeList对象,所有可以如下实现:
*/
NodeList nodeList = document.getElementsByTagName("nodeName");
/*
通过Document的getLength()方法可以查看该xml文件中根目录下面有几个子节点
*/
System.out.println("xml文件中根目录下面有"+document.);
下面整理DOM解析中用到的类方法:
DocumentBuilderFactory.newInstance()//新建DocumentBuilderFactory对象
DocumentBuilderFactory的newDocumentBuilder()方法//新建DocumentBuilder对象
DocumentBuilder的parse()方法,加载xml文件到document,返回类型为Document
Document的getElementsByTagName("nodeName")返回该document下的所以节点名为nodeName的节点,返回类型为NodeList
NodeList的itme(index)方法NodeList中下标为index的节点,返回类型为Node
Node的getAttributes()方法获取Node节点的属性集合,返回类型为NamedNodeMap
NamedNodeMap的itme(index)返回下标为index的属性节点,返回值为Node
getName()获取属性名
Node下的getChildNodes()方法获取Node节点下的子节点
2.SAX解析方式
新建SAXParserFactory对象,通过SAXParserFactory对象的newSAXParser()方法创建SAXParser对象,然后需要新建一个SAXParserHandler对象因为SAXParser对象的 parse()方法需要传递一个SAXParserHandler对象进去,这个SAXParserHandler类需要我们自己重写,这个类继承DefaultHandler父类,并且需要重写如下几个方法
//用来标识解析开始
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("xml文件解析开始");
}
//用来标识解析结束
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
//新建一个BOOk对象
System.out.println("xml文件解析结束");
}
//用来遍历xml的开始标签
@Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
/*这个方法中,传递进来的qName是节点名,attributes是节点属性,可以通过遍历attributes来遍历这个一个节点的属性,获取属性名和属性值*/
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
/*这是结束标签的方法,qName是这个节点的节点名,可以通过equals方法来判断是哪个标签结束了,但是不能得到该节点的节点值,节点值可以通过重写characters()方法来得到,然后通过一个全局变量存储得到的节点值,在这个方法中调用全局变量得到节点值*/
}
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
"全局变量名" = new String(ch,start, length);
}
3.JDOM解析方式
JDOM解析方式
通过SAXBuilder的build方法将xml文件加载到Document,然后通过getRootElement()方法得到根结点,通过根结点的getChildren方法获取子节点返回是一个List遍历List得到每个子节点,通过子节点的getAttributes()方法得到属性列表,
4.DOM4J解析方式
//创建一个SAXReader实例
SAXReader reader = new SAXReader();
//解析books.xml,获得一个根结点
Document document = reader.read(new File("XMLFileName.xml"));
//获取一个根结点
Element bookStore = document.getRootElement();
//通过element的elementIterator
Iterator it = bookStore.elementIterator();
//迭代器有个Next()方法和hasNext方法,这样就可以遍历Iterator了
,可以用next方法得到根目录下每个子节点,返回值为Element类型,然后可以通过attributes()得到属性列表返回的是List,这样遍历list可以得到这本书的所以属性
Element的elementIterator()这个方法可以得到(API:ElementIterator,顾名思义,沿 Element 树进行迭代。)这样可以得到这个节点的子节点通过next获得每个节点
各种解析方法利弊分析:
1.DOM解析
DOM解析是将整个DOM树全部加载到内存中,如果XML文件较大的话对内存损坏很严重。DOM代码直观易看!
2.SAX解析
基于事件解析的,每解析到一个标签会调用Handler对应的方法,对内存耗费比较小,适用于只需要处理XML中数据时,对内存数据结构不关心。但是编码不方便。很难同时访问同一个XML文件的多处不同数据
3.JDOM解析
JDOM 仅使用具体类不使用接口,API大量使用了Collections类
4.DOM4J解析
是JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能
使用接口和抽象基本类方法,是一个优秀的JAVA XML API
具有性能优异,灵活性好,功能强大和极端易使用的特点