xml解析之dom解析

上节大概了解了xml,这节我们来对xml进行解析,前面说了,xml能保存数据和数据之间的结构,当我们用这些数据时,需要对他们进行解析,xml解析也是比较常见的一种业务需求,需要掌握

dom解析

1) dom解析    在内存中形成一个dom树
    优点: dom树在内存中,速度快
    缺点: 在解析大文档的时候,消耗大量内存

2)DOM解析XML文件步骤
  创建解析器工厂对象
  解析器工厂对象创建解析器对象
  解析器对象指定XML文件创建Document对象
  以Document对象为起点操作DOM树  
这是案例中用到的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="children">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
    </book>

    <book category="cooking">
          <title lang="en">Everyday Italian</title> 
          <author>Giada De Laurentiis</author> 
          <year>2005</year> 
          <price>30.00</price> 
    </book>

    <book category="web">
          <title lang="en">Learning XML</title> 
          <author>Erik T. Ray</author> 
          <year>2003</year> 
          <price>39.95</price> 
    </book>

    <book category="web">
          <title lang="en">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>

</bookstore>


package xml;

import java.io.File;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


public class DomParser {

    public static void main(String[] args) throws Exception
    {
        // step 1:获得DOM解析器工厂
        // 工厂的作用是创建具体的解析器
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        // step 2:获得具体的dom解析器
        DocumentBuilder db = dbf.newDocumentBuilder();

        // step 3:解析一个xml文档,获得Document对象(根节点)
        // 此文档放在项目目录下即可
        Document document = db.parse(new File("resource/Demo1.xml"));

        // 根据标签名访问节点
        NodeList list = document.getElementsByTagName("book");
        System.out.println("list length: " + list.getLength());

        // 遍历每一个节点
        for (int i = 0; i < list.getLength(); ++i)
        {
            System.out.println("----------------------");
            // 获得元素,将节点强制转换为元素
            Element element = (Element) list.item(i);
            // 此时element就是一个具体的元素

            // 获取子元素:子元素title只有一个节点,之后通过getNodeValue方法获取节点的值
            String content0 = element.getElementsByTagName("title").item(0)
                    .getNodeValue();

            System.out.println(content0);// 此处打印出为null
            // 因为节点getNodeValue的值永远为null

            // 解决方法:加上getFirstChild()
            String content = element.getElementsByTagName("title").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("title: " + content);// 此处打印出书名

            // 后面类似处理即可:
            content = element.getElementsByTagName("author").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("author: " + content);
            content = element.getElementsByTagName("year").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("year: " + content);
            content = element.getElementsByTagName("price").item(0)
                    .getFirstChild().getNodeValue();
            System.out.println("price: " + content);
        }
    }

}


第二个dom解析xml的例子

package xml;


import java.io.File;
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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Domparser2 {

    /**
     * 上一个例子是我从别人博客上copy下来的,博客地址我放在文末,有兴趣可以看看
     * 这个例子我自己来,看能不能写出来吧,毕竟好久没用了。。。
     * 唉,学而时习之。。。
     * @param args
     * @throws ParserConfigurationException 
     * @throws IOException 
     * @throws SAXException 
     */
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

        //1.创建工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        //2.获取解析器
        DocumentBuilder builder=factory.newDocumentBuilder();
        //3.解析xml文档,获取文档模型
        Document document=builder.parse(new File("resource/Demo1.xml"));
        //4.执行操作
        NodeList list=document.getElementsByTagName("book");
        //5.遍历
        /**
         *     <book category="children">
          <title lang="en">Harry Potter</title> 
          <author>J K. Rowling</author> 
          <year>2005</year> 
          <price>29.99</price> 
    </book>
         */
        System.out.println("有"+list.getLength()+"本书");
        for (int i = 0; i < list.getLength(); i++) {
            System.out.println("-------------------");
            //6.获取每一个书节点
            Node node=list.item(i);
            //7.获取书节点的所有子节点
            NodeList childlist=node.getChildNodes();
            for (int j = 0; j < childlist.getLength(); j++) {
                Node childNode =childlist.item(j);
                String name=childNode.getNodeName();
                //可以看到结果,不过这里有个问题,getnodeName貌似每次第一个得到的是#Text   很奇怪,先放着,完了回头看

                String value=childNode.getTextContent();
                System.out.println(name+":"+value);


            }


        }
    }
}

代码中的第一个案例取自这个博客,如有侵权,联系修改

猜你喜欢

转载自blog.csdn.net/wlyang666/article/details/78754978