zoukankan      html  css  js  c++  java
  • DOM方式解析XML文件实例

    books.XML文件:

    <?xml version="1.0" encoding="utf-8"?>
    <bookstore>
        <book id="1">
            <name>冰与火之歌</name>
            <author>乔治马丁</author>
            <price>88.0</price>
            <year>2014</year>
        </book>
        <book id="2">
            <name>安徒生童话</name>
            <price>77.0</price>
            <language>English</language>
        </book>
    </bookstore>

    把这个文档放在项目的根路径下,与src目录平行,就可以使用相对路径来引用了。

    Java代码部分:

     public class DOMTest {
        public static void main(String[] args) {

       // step 1:获得DOM解析器工厂

       // 工厂的作用是创建具体的解析器,即创建一个DocumentBuilderFactory对象
            
    DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            try {
                // step 2:获得具体的dom解析器   创建一个DocumentBuilder对象
                DocumentBuilder db=dbf.newDocumentBuilder();
                // step 3:解析一个xml文档,通过Document对象的parse方法加载books.xml文件到当前目录下
                Document document=db.parse("books.xml");
                //获取所有book节点的集合
                NodeList booklist= document.getElementsByTagName("book");
                //遍历每一个book节点
               //  通过getLength()获取NodeList的长度
                for(int i=0;i<booklist.getLength();i++){
                    System.out.println("下面开始遍历第"+(i+1)+"本书");
                //    节点有多个属性时:
                    //通过item(i)获取bookList的节点值,NodeList索引值从0开始
                    Node book=booklist.item(i);
                    //获取book的所有属性
                    NamedNodeMap attrs= book.getAttributes();
                    for(int j=0;j<attrs.getLength();j++){
                        //通过item(index)方法获取book节点的某一个属性
                      
     Node attr=attrs.item(j);
                        //获取属性名
                        System.out.println("属性名:"+attr.getNodeName());
                        //获取属性值
                        System.out.println("属性值:"+attr.getNodeValue());
                    }
                    //当知道节点只有一个id属性时:
                    /*Element attr= (Element) booklist.item(i);
                    String attributeValue=attr.getAttribute("id");
                    System.out.println("id属性的属性值为:"+attributeValue);*/
                    
                    //下面解析book节点的子节点
                    NodeList childNodes = book.getChildNodes();
                    System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
                    //获取每个节点的节点名和节点值
                    for(int k=0;k<childNodes.getLength();k++){
                        //区分出text类型的node及element类型的node
                        if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
                            //获取了element类型的节点的节点名
                            System.out.print("第"+(k+1)+"个子节点的节点名称是:"+childNodes.item(k).getNodeName());
                            //两者之间的区别是Element类型的节点值为空
                            System.out.println("------"+childNodes.item(k).getFirstChild().getNodeValue());
                      //   System.out.println("------"+childNodes.item(k).getTextContent());
                        }
                    }
                }
                System.out.println("===============循环结束==============");
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    具体过程参见注释。

    首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象。 

           我们在这里使用DocumentBuilderFactory的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。

          又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。

      所以当在不同的解析器之间进行切换时,值需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

          当获得一个工厂对象之后,使用它的静态方法newDocumentBuilder(),可以获得一个DocumentBuilder对象

      这个对象代表了具体的DOM解析器。

      解析器的具体实现对于程序来说并不重要。  

      然后,我们就可以利用这个解析器对文档进行解析了。

      Sun公司提供了默认的工厂和默认的解析器,上面的例子中就使用了默认的解析器。

  • 相关阅读:
    项目1:即时标记
    每天一个小程序—0000题(python图像处理)
    每天一个小程序—0004题(统计单词出现次数)
    每天一个小程序—第0001题(uuid模块)
    python实现八皇后问题
    2018/01/05——时间会改变一切!
    HDU 6249 Alice’s Stamps(dp)
    51nod 1422 沙拉酱前缀
    【转】DSP动态内存分配函数的使用
    优秀人的博客
  • 原文地址:https://www.cnblogs.com/aa6055blog/p/4630140.html
Copyright © 2011-2022 走看看