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="ok@sina.com">
        
<name>刘晨</name>
        
<sex>man</sex>
        
<age>23</age>
        
<class>数学一班</class>
    
</person>
    
<person email="good@tom.com">
        
<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取得数据库中的数据一样。

posted on 2009-02-25 22:49 duduli 阅读(2790) 评论(2)  编辑  收藏 所属分类: java

评论

# re: java解析xml文件及一个问题 2009-02-26 09:49 逝水fox

你把节点和节点之间的空白部分全部清除掉就没有这个空的节点值了

原因是在于 SAX对 节点和节点之间空白部分的判定 他把他判定成包含这些空白字符的文本节点 而不是忽略掉 所以就有这个问题  回复  更多评论   

# re: java解析xml文件及一个问题 2014-10-23 19:11 tert

xgdgs  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

导航

统计

公告

welcome to my place.

常用链接

留言簿(5)

我参与的团队

随笔分类

随笔档案

新闻分类

石头JAVA摆地摊儿

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

@duduli