java解析xml之DOM解析

首先引入一段DOM解析的概念:

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

下面介绍两种我用到过的DOM解析方法:

一:对整个xml进行解析,通过node.getNodeType()==Node.ELEMENT_NODE判断是否一个新的节点开始,可以用来获取多组数据。通过TagName获取内容。DocumentBuilder dombuilder=domfac.newDocumentBuilder();

         InputStream is=new FileInputStream("*******.xml");

         Document doc=dombuilder.parse(is);

         Element root=doc.getDocumentElement();
         NodeList books=root.getChildNodes();
	 if(books!=null){
	   for(int i=0;i < books.getLength();i++){
                Node book=books.item(i);
                if(book.getNodeType()==Node.ELEMENT_NODE){
                  for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
                        if(node.getNodeType()==Node.ELEMENT_NODE){
                            if(node.getNodeName().equals("name")){
                                 String name=node.getFirstChild().getNodeValue();
                             }
                         }
                     }
                   }
	   }
        }
 

二:获取某个标签然后对该标签进行遍历

  try {

          URL url = new URL("url");
          try {
            URLConnection URLconnection =url.openConnection () ;
            HttpURLConnection httpConnection =(HttpURLConnection)URLconnection;
            int responseCode =httpConnection.getResponseCode ( ) ;
            if ( responseCode == HttpURLConnection.HTTP_OK) {
                InputStream in = httpConnection.getInputStream ( ) ;
                try {
                    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
                    DocumentBuilder db=factory.newDocumentBuilder();
                    Document doc = db.parse(in);
                    
                    NodeList nl = doc.getElementsByTagName("Hotel");//对xml中所有Hotel标签进行循环
                    for (int j=0;j<nl.getLength();j++){
                        System.out.println(doc.getElementsByTagName("ID").item(j).getFirstChild().getNodeValue());//根据标签名称获取值
                        System.out.println(doc.getElementsByTagName("TaxPercentage").item(j).getFirstChild().getNodeValue());
                        System.out.println(doc.getElementsByTagName("Name").item(j).getFirstChild().getNodeValue());

                        NodeList nlAmen = doc.getElementsByTagName("HotelAmenities").item(j).getChildNodes();//该标签含有子标签
                        for(int m=0;m<nlAmen.getLength();m++){
                            Node nn = nlAmen.item(m);
                            Node nnn = nn.getFirstChild();
                            if(nnn != null){
                                System.out.println(nnn.getNodeValue());
                            }
                        }
                    }
                } catch(Exception e ) {
                     e.printStackTrace() ;
                }
             } else {
                 System.out.println( "HTTP connection response !=HTTP_OK" );
             }
          } catch(IOException e) {
               e.printStackTrace ( ) ;
          }
       } catch (MalformedURLException e ) {
           e.printStackTrace ( ) ;
       }

 

 

以上两种解析方法,个人认为第二种更加清晰一些,使用起来更方便,它不仅可以解析整个xml,也可以只关注xml的某一块,如:只解析xml中<name>标签的内容NodeList nl = doc.getElementsByTagName("name");

你可能感兴趣的:(java,数据结构,工作,xml,J#)