java解析xml文件及一个问题

java解析xml文件及一个问题

Java解析xml有几种方法,而我这里只选择2中方法,DOM和SAX进行解析。
xml文件。
<? xml version="1.0" encoding="UTF-8" ?>
< persons >
    
< person >
        
< name > 刘晨 </ name >
        
< sex > </ sex >
        
< age > 23 </ age >
        
< class > 数学一班 </ class >
    
</ person >
    
< person >
        
< name > 张凤 </ name >
        
< sex > </ sex >
        
< age > 21 </ age >
        
< class > 英语四班 </ class >
    
</ person >
</ persons >
首先是DOM。代码
 1  package  com.duduli.xml;
 2 
 3  import  java.io.IOException;
 4 
 5  import  javax.xml.parsers.DocumentBuilder;
 6  import  javax.xml.parsers.DocumentBuilderFactory;
 7  import  javax.xml.parsers.ParserConfigurationException;
 8 
 9  import  org.w3c.dom.Document;
10  import  org.w3c.dom.Node;
11  import  org.w3c.dom.NodeList;
12  import  org.xml.sax.SAXException;
13 
14 
15  public   class  DomParse {
16 
17       public   void  parseXML(){
18          DocumentBuilderFactory factory  =  DocumentBuilderFactory.newInstance();
19           try  {
20              DocumentBuilder db  =  factory.newDocumentBuilder();
21              Document doc  =  db.parse( " src\\com\\duduli\\xml\\person.xml " );
22              NodeList root  =  doc.getElementsByTagName( " person " );
23               int  rootSize  =  root.getLength();
24                   for  ( int  i  =   0 ; i  <  rootSize; i ++ ) {
25                      System.out.println( " 解析第 "   +  (i + 1 + " 个同学 " );
26                      Node n  =  root.item(i);
27                      NodeList child  =  n.getChildNodes();
28                       int  childSize  =  child.getLength();
29                           for  ( int  j  =   0 ; j  <  childSize; j ++ ) {
30                              Node n2  =  child.item(j);
31                               if  (n2.hasChildNodes()) {
32                                  System.out.println(n2.getNodeName()  +   "  =  "   +  n2.getFirstChild().getNodeValue());
33                             }
34                          }
35                          System.out.println();
36                      }
37          } catch  (ParserConfigurationException e) {
38              e.printStackTrace();
39          }  catch  (SAXException e) {
40              e.printStackTrace();
41          }  catch  (IOException e) {
42              e.printStackTrace();
43          }
44      }
45 
46       public   static   void  main(String[] args) {
47          DomParse dp  =   new  DomParse();
48          dp.parseXML();
49      }
50 
51  }
52 

输出:
解析第1个同学
name 
=  刘晨
sex 
=  男
age 
=   23
class   =  数学一班

解析第2个同学
name 
=  张凤
sex 
=  女
age 
=   21
class   =  英语四班
还有一个就是用SAX
 1  package  com.duduli.xml;
 2 
 3  import  java.io.File;
 4  import  java.io.IOException;
 5 
 6  import  javax.xml.parsers.ParserConfigurationException;
 7  import  javax.xml.parsers.SAXParser;
 8  import  javax.xml.parsers.SAXParserFactory;
 9 
10  import  org.xml.sax.Attributes;
11  import  org.xml.sax.SAXException;
12  import  org.xml.sax.helpers.DefaultHandler;
13 
14   
15  public   class  SaxParse  extends  DefaultHandler  
16  {       
17       public   static   void  main(String[] args)   
18      {   
19          SAXParserFactory factory  =  SAXParserFactory.newInstance();
20           try  {
21              SAXParser parser  =  factory.newSAXParser();
22               try  {
23                  parser.parse( new  File( " src\\com\\duduli\\xml\\person.xml " ),  new  SaxParse());
24              }  catch  (IOException e) {
25                  e.printStackTrace();
26              }
27          }  catch  (ParserConfigurationException e) {
28              e.printStackTrace();
29          }  catch  (SAXException e) {
30              e.printStackTrace();
31          }
32      }
33      
34       public   void  startDocument(){
35          System.out.println( " ***开始*** " );
36      }
37          
38       public   void  startElement(String uri,String localName,String qName,Attributes attribute)
39       throws  SAXException{
40          System.out.println( " 开始节点 : "   +  qName);
41      }
42      
43      
44       public   void  characters( char [] ch,  int  start,  int  length)
45               throws  SAXException {
46  //         System.out.println("--------"+new String(ch,start,length)+"--------");
47           if ( new  String(ch,start,length)  !=   " \n\r " ){
48           System.out.println( " 节点值:  "   +   new  String(ch,start,length));
49          }
50      }
51 
52       public   void  endElement(String uri, String localName, String name)
53               throws  SAXException {
54          System.out.println( " 结束节点:  "   +  name);
55      }
56 
57       public   void  endDocument (){
58           System.out.println( " ****文档结束*** " );
59       }
60  }
61
在这里需要指出的是dom方法在对于嵌套的xml解析是不能成功的。
用SAM解析就是extends DefaultHandler这个方法,然后复写他已有的方法。
输出: ***开始***
开始节点 :persons
节点值: 
    
开始节点 :person
节点值: 
        
开始节点 :name
节点值: 刘晨
结束节点: name
节点值: 
        
开始节点 :sex
节点值: 男
结束节点: sex
节点值: 
        
开始节点 :age
节点值: 
23
结束节点: age
节点值: 
        
开始节点 :
class
节点值: 数学一班
结束节点: 
class
节点值: 
    
结束节点: person
节点值: 
    
开始节点 :person
节点值: 
        
开始节点 :name
节点值: 张凤
结束节点: name
节点值: 
        
开始节点 :sex
节点值: 女
结束节点: sex
节点值: 
        
开始节点 :age
节点值: 
21
结束节点: age
节点值: 
        
开始节点 :
class
节点值: 英语四班
结束节点: 
class
节点值: 
    
结束节点: person
节点值: 

结束节点: persons
**** 文档结束 ***

如果看SAX结果就知道,不管是开始节点还是结束节点都会有个“节点值”的输出。
这个弄了我又很久,不知道哪位有什么解决的办法没?


按照所获将xml修改为
<? xml version="1.0" encoding="UTF-8" ?>
< persons >
< person >
< name > 刘晨 </ name >
< sex ></ sex >
< age > 23 </ age >
< class > 数学一班 </ class >
</ person >
< person >
< name > 张凤 </ name >
< sex ></ sex >
< age > 21 </ age >
< class > 英语四班 </ class >
</ person >
</ persons >

然后测试各个值,(start,length,及其关系),发现为空值的length都为1,所以修改characters方法
     public   void  characters( char [] ch,  int  start,  int  length)
            
throws  SAXException {
//         System.out.println("--------"+new String(ch,start,length)+"--------");
         if (length  !=   1 ){
//             System.out.println(length);
         System.out.println( " 节点值:  "   +   new  String(ch,start,length));
        }
    }
 
此时问题又出现了,在sex的中length也为1.
没办法修改sex,男修改为man,而女修改为woman。
得到正确结果
*** 开始 ***
开始节点 :persons
开始节点 :person
开始节点 :name
节点值: 刘晨
结束节点: name
开始节点 :sex
节点值: man
结束节点: sex
开始节点 :age
节点值: 
23
结束节点: age
开始节点 :
class
节点值: 数学一班
结束节点: 
class
结束节点: person
开始节点 :person
开始节点 :name
节点值: 张凤
结束节点: name
开始节点 :sex
节点值: woman
结束节点: sex
开始节点 :age
节点值: 
21
结束节点: age
开始节点 :
class
节点值: 英语四班
结束节点: 
class
结束节点: person
结束节点: persons
**** 文档结束 ***

一下是JDOM解析xml文件
xml文件
<? xml version="1.0" encoding="UTF-8" ?>
< persons >
    
< person  email ="[email protected]" >
        
< name > 刘晨 </ name >
        
< sex > man </ sex >
        
< age > 23 </ age >
        
< class > 数学一班 </ class >
    
</ person >
    
< person  email ="[email protected]" >
        
< name > 张凤 </ name >
        
< sex > woman </ sex >
        
< age > 21 </ age >
        
< class > 英语四班 </ class >
    
</ person >
</ persons >

代码:
package  com.duduli.xml;

import  java.io.IOException;
import  java.io.FileOutputStream;
import  java.util.Iterator;
import  java.util.List;

import  org.jdom.Document;
import  org.jdom.Element;
import  org.jdom.JDOMException;
import  org.jdom.input.SAXBuilder;
import  org.jdom.output.XMLOutputter;

public   class  JDomParse {
    @SuppressWarnings(
" unchecked " )
    JDomParse(String path){
    SAXBuilder builder 
=   new  SAXBuilder( false );
    
try  {
        Document doc 
=  builder.build(path);
        Element persons 
=  doc.getRootElement();
        List list 
=  persons.getChildren( " person " );
        
for (Iterator it  =  list.iterator();it.hasNext();){
            Element person 
=  (Element) it.next();
//             getArrtibuteValue得到的是属性值
            String email  =  person.getAttributeValue( " email " );
            System.out.println(email);
            String name 
=  person.getChildTextTrim( " name " );
            System.out.println(name);
            String sex 
=  person.getChildTextTrim( " sex " );
            System.out.println(sex);
            String age 
=  person.getChildTextTrim( " age " );
            System.out.println(age);
            String className 
=  person.getChildTextTrim( " class " );
            System.out.println(className);
            System.out.println();
        }
        XMLOutputter out 
=   new  XMLOutputter();
        out.output(doc, 
new  FileOutputStream(path));
    } 
catch  (JDOMException e) {
        e.printStackTrace();
    } 
catch  (IOException e) {
        e.printStackTrace();
    }
    }

    
public   static   void  main(String[] args) {
         new  JDomParse( " src\\com\\duduli\\xml\\person.xml " );

    }

}
首先你必须先倒入jdom的开发包。
觉得jdom的方法很简单,类似于jdbc取得数据库中的数据一样。

你可能感兴趣的:(java解析xml文件及一个问题)