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 >
< 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
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 = 英语四班
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
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
**** 文档结束 ***
节点值:
开始节点 :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 >
< 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));
}
}
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
**** 文档结束 ***
开始节点 :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 >
< 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的开发包。
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的方法很简单,类似于jdbc取得数据库中的数据一样。