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取得数据库中的数据一样。