目前流行的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
    具有性能优异,灵活性好,功能强大和极端易使用的特点