一、java解析xml文档
1、了解使用w3c组织提供的java组件解析xml文件
2、*掌握使用开源组织的Dom4j解析xml文档
3、*掌握使用dom4解析xml文档过程
4、*使用dom4j组件对xml文档进行管理
二、使用w3c提供的组件解析xml文件
1、常用的解析文档的步骤
(1)创建文档构建工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
(2)使用文档构建工厂获取xml的文档构建对象
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
(3)使用构建对象加载xml文件,并获取W3c的Document(文档)对象
Document document=documentBuilder.parse(file);
(4)使用Document对象获取节点列表对象NodeList,使用元素名称进行获取
NodeList sid_nodeList=document.getElementsByTagName("sid");
NodeList sname_nodeList=document.getElementsByTagName("sname");
NodeList sex_nodeList=document.getElementsByTagName("sex");
NodeList address_nodeList=document.getElementsByTagName("address");
NodeList sdate_nodeList=document.getElementsByTagName("sdate");
NodeList classname_nodeList=document.getElementsByTagName("className");
(5)使用NodeList对象获取xml文档中的元素对象并获取其中的文本内容
//获取sid元素的节点列表
NodeList sid_nodeList=document.getElementsByTagName("sid");
NodeList sname_nodeList=document.getElementsByTagName("sname");
NodeList sex_nodeList=document.getElementsByTagName("sex");
NodeList address_nodeList=document.getElementsByTagName("address");
NodeList sdate_nodeList=document.getElementsByTagName("sdate");
NodeList classname_nodeList=document.getElementsByTagName("className");
System.out.println("sid元素的个数:"+sid_nodeList.getLength());
//获取sid元素的文本内容
for (int i = 0; i < sid_nodeList.getLength(); i++) {
Node sidNode=sid_nodeList.item(i);
Node snameNode=sname_nodeList.item(i);
Node sexNode=sex_nodeList.item(i);
Node addressNode=address_nodeList.item(i);
Node sdateNode=sdate_nodeList.item(i);
Node classnameNode=classname_nodeList.item(i);
//获取sid节点的文本内容
String sid=sidNode.getTextContent();
String sname=snameNode.getTextContent();
String sex=sexNode.getTextContent();
String address=addressNode.getTextContent();
String sdate=sdateNode.getTextContent();
String classname=classnameNode.getTextContent();
System.out.println("编号:"+sid);
System.out.println("姓名:"+sname);
System.out.println("性别:"+sex);
System.out.println("地址:"+address);
System.out.println("生日:"+sdate);
System.out.println("班级:"+classname);
System.out.println("==========================");
}
完整的解析代码示例:
(1)student.xml结构
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<sid>1</sid>
<sname>张飞</sname>
<sex>男</sex>
<address>北京</address>
<sdate>1998-12-21</sdate>
<className>java1班</className>
</student>
<student>
<sid>2</sid>
<sname>赵云</sname>
<sex>男</sex>
<address>常山</address>
<sdate>1999-11-21</sdate>
<className>java2班</className>
</student>
<student>
<sid>3</sid>
<sname>关羽</sname>
<sex>男</sex>
<address>运城</address>
<sdate>1997-10-21</sdate>
<className>java1班</className>
</student>
<student>
<sid>4</sid>
<sname>马超</sname>
<sex>男</sex>
<address>汉中</address>
<sdate>1998-12-21</sdate>
<className>java1班</className>
</student>
<student>
<sid>5</sid>
<sname>黄忠</sname>
<sex>男</sex>
<address>长沙</address>
<sdate>1998-12-21</sdate>
<className>java1班</className>
</student>
</students>
(2)W3c解析的步骤和过程:
package com.test;
import java.util.*;
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XmlDemo1 {
/**
* @param args
*/
public static void main(String[] args) {
//创建文件对象指定要操作的xml文件的路径
File file=new File("student.xml");
//创建文档构建工厂对象
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
try {
//通过文档工厂构建对象获取文档构建对象
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
//使用文档构建对象加载xml文件对象,获取文档对象
Document document=documentBuilder.parse(file);
//获取sid元素的节点列表
NodeList sid_nodeList=document.getElementsByTagName("sid");
NodeList sname_nodeList=document.getElementsByTagName("sname");
NodeList sex_nodeList=document.getElementsByTagName("sex");
NodeList address_nodeList=document.getElementsByTagName("address");
NodeList sdate_nodeList=document.getElementsByTagName("sdate");
NodeList classname_nodeList=document.getElementsByTagName("className");
System.out.println("sid元素的个数:"+sid_nodeList.getLength());
//获取sid元素的文本内容
for (int i = 0; i < sid_nodeList.getLength(); i++) {
Node sidNode=sid_nodeList.item(i);
Node snameNode=sname_nodeList.item(i);
Node sexNode=sex_nodeList.item(i);
Node addressNode=address_nodeList.item(i);
Node sdateNode=sdate_nodeList.item(i);
Node classnameNode=classname_nodeList.item(i);
//获取sid节点的文本内容
String sid=sidNode.getTextContent();
String sname=snameNode.getTextContent();
String sex=sexNode.getTextContent();
String address=addressNode.getTextContent();
String sdate=sdateNode.getTextContent();
String classname=classnameNode.getTextContent();
System.out.println("编号:"+sid);
System.out.println("姓名:"+sname);
System.out.println("性别:"+sex);
System.out.println("地址:"+address);
System.out.println("生日:"+sdate);
System.out.println("班级:"+classname);
System.out.println("==========================");
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、xml文档的解析类型
1、DOM(Document Object Model)解析
需要将整个xml文档加载到内存中,在内存中形成倒挂的文档树。从根节点逐次向子节点进行查询遍历的方式。此解析方式比较耗费内存,尤其是文档内容比较多的时候。
2、SAX解析
不需要将整个xml文档加载到内存,通过文档对象的节点事件方法,可以做到,解析到哪里就在哪里停止。内存的消耗比较低,但是不利于文档元素的增删改操作,查询效率很高。
四、使用第三方组件Dom4j解析xml文档
1、在当前工程引入dom4j.jar组件,并加入到构建路径
在当前工程的根目录建立文件夹libs
点finish结束
将
复制到libs下
选中libs下的两个jar文件点击右键,选择如下图所示,加入到构建路径
完成以上操作后,dom4j的组件就加入到了当前工程中。可在代码中调用dom4j.jar的类文件。
2、使用dom4j的组件解析xml文档的步骤
(1)获取Dom4j的SaxReader对象.
SAXReader saxReader=new SAXReader();
(2)使用SaxReader对象加载xml文件对象,并获取dom4j的Document对象
Document document=saxReader.read(file);
(3)使用Document对象获取根元素对象
Element rootElement=document.getRootElement();
(4)根据跟元素对象获取子元素的集合对象List
List listStudentElement=rootElement.elements(“student”);
3、解析示例:
package com.test;
import java.util.*;
import java.io.*;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.*;
public class Dom4jDemo {
/**
* @param args
*/
public static void main(String[] args) {
//创建文件对象,指定要操作的XML文档路径
File file=new File("student.xml");
//创建SaxReader对象
SAXReader saxReader=new SAXReader();
try {
//使用saxReader对象加载xml文件对象,并获取dom4j的Document对象
Document document=saxReader.read(file);
//获取根元素对象
Element rootElement=document.getRootElement();
//使用跟元素对象获取子元素的集合
List<Element> listStudentElement=rootElement.elements("student");
System.out.println("student元素的个数:"+listStudentElement.size());
//通过学生元素节点,获取每个学生元素下的子元素节点的文本内容
for (Element stuelement : listStudentElement) {
String sid=stuelement.elementText("sid");//获取sid元素的内容
String sname=stuelement.elementText("sname");//获取sname元素的内容
String sex=stuelement.elementText("sex");//获取sex元素的内容
String address=stuelement.elementText("address");//获取address元素的内容
String sdate=stuelement.elementText("sdate");//获取sdate元素的内容
String classname=stuelement.elementText("className");//获取classname元素的内容
System.out.println("编号:"+sid);
System.out.println("姓名:"+sname);
System.out.println("性别:"+sex);
System.out.println("地址:"+address);
System.out.println("生日:"+sdate);
System.out.println("班级:"+classname);
System.out.println("============================");
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}