使用DOM 、DOM4J解析XML

学习过程中的一些浅显认识
一、XML
1、什么是XML?
XML是可扩展标记语言( Extensible Markup Language )使用简单的标记来描述数据。
XML中开始的控制标记与结束的控制标记缺一不可,成对出现。
以下例子简单说明:
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML声明,XML文件的第一行必须是xml声明,定义版本号和编码,不是必须提供的 -->
<students>
<!-- 元素 ELEMENT =开始标签 内容 结束标签 只能有一个根元素,如students-->
<student id="161212001">
<!-- 属性 Attriubute Attr 只能存在于一个元素的开始标签中,属性值的设置必须被"""包围起来如:id -->
<name>李明</name>
<age>&amp;gt;23</age>
<score>98</score>
</student>
<student id="161212002">
<name>李刚</name>
<age><![CDATA[<23]]></age>
<score>84</score>
</student>
</students>
2、XML的作用
1)数据存储
2)数据交换
3)数据配置
二、使用DOM解析XML
1、基本思路
文档对象模型( Document Object Model )
DOM把XML文档映射成一个倒挂的树,每个节点都是一个对象
2、基本概念
Document
Document对象代表了整个XML文档
所有其它的Node都以一定的顺序包含在Document对象之内
它也是对XML文档进行操作的起点
Node
是DOM结构中最基本的对象,代表了文档树中的一个抽象节点,实际使用的时候,很少会真正用到Node这个对象,而是用到诸如Element、Attr、Text等Node对象的子对象。
NodeList
指一个包含了一个或者多个节点(Node)的列表,可以简单的把它看成一个Node数组
Element
代表XML文档中的标签元素
继承自Node对象,是Node最主要的子对象
使用DOM解析XML
3、基本步骤
创建解析器工厂对象
由解析器工厂对象创建解析器对象
由解析器对象对指定XML文件进行解析,构建相应DOM树,创建Document对象
以Document对象为起点对DOM树的节点进行增删改查操作。
缺点
没有封装更多的细节,代码繁琐
以下代码为例,解析上文中的XML:
实体类:
public class StudentBean {
String id;
String name;
String age;
String score;
public String getId() {return id;}
public void setId(String id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getAge() {return age;}
public void setAge(String age) {this.age = age;}
public String getScore() {return score;}
public void setScore(String score) {this.score = score;}
}

注:解析XML,代码中与XML的嵌套都是相互匹配的
使用DOM解析代码块:
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLMain {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory fac= DocumentBuilderFactory.newInstance();//创建解析器工厂对象
DocumentBuilder db=fac.newDocumentBuilder();//由解析器工厂对象创建解析器对象
Document dc=db.parse("students.xml");//由解析器对象对指定XML文件进行解析,构建相应DOM树,创建Document对象,以Document对象为起点对DOM树的节点进行增删改查操作。
NodeList students=dc.getElementsByTagName("students");
Node stu_node=students.item(0);
NodeList student=stu_node.getChildNodes();
for(int i=0;i<student.getLength();i++){
if(student.item(i).getNodeType()==Node.ELEMENT_NODE){
Element ele=(Element)student.item(i);
String id=ele.getAttribute("id");
System.out.println(id);
}
Node stu_ch_node=student.item(i);
NodeList student_f =stu_ch_node.getChildNodes();
for(int j=0;j<student_f.getLength();j++){
if(student_f.item(j).getNodeType()==Node.ELEMENT_NODE){
Element ele=(Element)student_f.item(j);
String name=ele.getTagName();
String value=ele.getTextContent();
System.out.println(value);
}
}
}
}
}
使用DOM4J解析代码块(需要导入dom4 jar包):
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class XMLDom4j {
public static void main(String[] args) throws DocumentException {
//1.读取文件形成DOM树
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("students.xml"));
//2.获取根节点students
Element studentsElem = doc.getRootElement();
//3.从根节点students中获取所有的student信息
Iterator<Element> it = studentsElem.elementIterator();
//4.处理所有的student内的信息
while(it.hasNext()){
//取出一个学生信息
Element stuElem = it.next();
//获取一个学生的所有属性并输出:id
List<Attribute> attributes = stuElem.attributes();
for(Attribute attr:attributes){
String aname = attr.getName();
String atext = attr.getText();
System.out.println(aname+"-----"+atext);
}
//获取一个学生的所有子元素并输出:name age score
Iterator<Element> it2 = stuElem.elementIterator();
while(it2.hasNext()){
Element nasElem = it2.next();
String ename = nasElem.getName();
String etext = nasElem.getText();
System.out.println(ename+"------>"+etext);
}
System.out.println();
}
}

展开阅读全文

没有更多推荐了,返回首页