先前用SAX解析了XML文档,今天用DOM和JDOM来解析。首先来说一下DOM,它是文档对象模型,它的特性是定义一组Java接口,基于对象,与语言和平台无关,将XML文档表示成树,在内存中解析和存储XML文档,允许随机访问文档的不同部分。它的优点是可以修改后更新,还可以在任何时候在树中导航,API用起来也简单。下面来看下代码
//XML文档
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person personId="1">
<id>123456</id>
<address>876556</address>
<name>小明</name>
</person>
<person personId="2">
<id>54534</id>
<address>82934u832</address>
<name>小李</name>
</person>
</people>
再定义一个Person类
public class Person {
private String id;
private String address;
private String name;
private String personId;
public void setPersonId(String personId){
this.personId=personId;
}
public String getPersonId(){
return personId;
}
public void setId(String id){
this.id=id;
}
public void setadd(String address){
this.address=address;
}
public void setname(String name){
=name;
}
public String getId(){
return id;
}
public String getname(){
return name;
}
public String getadd(){
return address;
}
}
接下来便是解析过程
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.soap.Node;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMparse {
@Test
public void Domparse() throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory builder=DocumentBuilderFactory.newInstance();//创建一个DOM解析器工厂对象
DocumentBuilder db=builder.newDocumentBuilder();//通过工厂对象创建解析器对象
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/xml/Person.xml");//获取文件
Document doc=db.parse(is);//从内存中读取数据
NodeList node_person=doc.getElementsByTagName("person");//获取元素节点
ArrayList<Person>p=new ArrayList<>();
Person p1=null;
for(int i=0;i<node_person.getLength();i++){
org.w3c.dom.Node personNode= node_person.item(i);
p1=new Person();
String personId=personNode.getAttributes().getNamedItem("personId").getNodeValue();
p1.setPersonId(personId);
NodeList childNodes=personNode.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
org.w3c.dom.Node item= childNodes.item(j);
String nodeName=item.getNodeName();
if("name".equals(nodeName)){
p1.setname(item.getFirstChild().getNodeValue());
}else if("id".equals(nodeName)){
p1.setId(item.getFirstChild().getNodeValue());
}else if("address".equals(nodeName)){
p1.setadd(item.getFirstChild().getNodeValue());
}
p.add(p1);
}
}
//迭代器迭代
Iterator it=p.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
它和XML比更消耗内存,比较适合j2ee开发。
接下来是JDOM解析器,首先要引入第三方开源组件,即jdom的jar包,它和DOM的区别还在于使用Java的collection接口,效率比DOM高
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.junit.Test;
public class JDOMParse {
@Test
public void JDOMParse() throws JDOMException, IOException{
SAXBuilder builder=new SAXBuilder();
InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/xml/Person.xml");//获取文件
Document build=builder.build(is);
Element rootElement=build.getRootElement();
Person person=null;
List<Person>p=new ArrayList();
List<Element>children=rootElement.getChildren();
for(Element element:children){
person=new Person();
String personId=element.getAttributeValue("personId");
person.setPersonId(personId);
List<Element>children1=element.getChildren();
for(Element e:children1){
String tag=e.getName();
if("name".equals(tag)){
person.setname(e.getText());
}else if("address".equals(tag)){
person.setadd(tag);
}else if("id".equals(tag)){
person.setId(tag);
}
}p.add(person);
}
Iterator p1=p.iterator();
while(p1.hasNext()){
System.out.println(p1.next());
}
}
}
以上便是两种解析XML的方法