xml解析之dom解析

来源:互联网 发布:经纬度换算坐标软件 编辑:程序博客网 时间:2024/05/29 18:59

上节大概了解了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);            }        }    }}

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