(一)XML解析技术
解析:用java等技术将xml文件中有用的信息提取出来的过程。
现常用的有两大类别:
- DOM类别: 一次性将硬盘中的xml文件加载到内存中形成一颗倒状树,从根节点开始从上向下遍历,获取有用节点的内容。
- SAX类别:分多次将硬盘中的xml文件加载到内存中,以事件的方式去解析节点中有用的内容。
在这里我们选择XML解析器:dom4.j;dom4.j开发包叫:dom4.j-1.6.1.jar导入到你的工程的CLASSPATH路径下
(二)DOM4.J简单介绍
1、Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性
2、Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j
3、使用Dom4j开发,需下载dom4j相应的jar文件
(三)DOM4J解析案例
- 1、获得document的三种方式
(1)读取
(2)字符串转换
(3)新建对象
(1)读取
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.XMLWriter;
public class Demo01 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//将内存中的xml文件写入硬盘中去
//创建一个内存中的document对象,表示硬盘中的xml文件
Document xmlDocument = DocumentHelper.createDocument();
//将内存中的document文件写入硬盘中,形成一个xml文件
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream(new File("E:/new123.xml"))
);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
结果:
(2)字符串转换
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//type01();
//字符串转换
String str = "<root><city>广州</city></root>";
Document xmlDocument = DocumentHelper.parseText(str);
XMLWriter xmlWriter = new XMLWriter(
new FileOutputStream(new File("E:/book1.xml"))
);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
(3)新建对象
public static void main(String[] args) throws Exception {
//新创建对象,dom4.j核心解析器
SAXReader saxReader = new SAXReader();
Document xmlDocument = saxReader.read(new File("E:/book.xml"));
System.out.println(xmlDocument !=null?"已读到xml文件":"未读取到xml文件");
}
结果:
- 2、获得根节点和其子节点
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo02 {
public static void main(String[] args) throws Exception {
//创建dom4.j解析器
SAXReader saxReader = new SAXReader();
//创建InputStream对象,指向硬盘中的xml文件
InputStream is = new FileInputStream(new File("E:/new.xml"));
Document xmlDocument = saxReader.read(is);
//获取根节点
Element rootElement = xmlDocument.getRootElement();
//输出根节点名字
System.out.println(rootElement.getName());
//获取根节点下面的直接子节点个数和名字
List<Element> listElement = rootElement.elements("city");
System.out.println(listElement.size());
for(int i = 0;i<listElement.size();i++){
System.out.println(listElement.get(i).getText());
}
}
}
- 3、遍历每个子节点属性和标签中的内容
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo03 {
public static void main(String[] args) throws Exception {
//遍历子节点的属性和内容
//创建dom4.j解析器
SAXReader saxReader = new SAXReader();
/*Document xmlDocument = saxReader.read(new File("E:/new.xml"));*/
//创建InputStream对象,指向硬盘中的XML文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
//通过字节流对象,加载硬盘中的XML文件到内存中
Document xmlDocument = saxReader.read(is);
//获取根节点
Element rootElement = xmlDocument.getRootElement();
//显示根节点的名字
System.out.println(rootElement.getName());
//获取根节点下面的直接子节点个数和名字
List<Element> elementList = rootElement.elements("book");
//子节点个数
System.out.println(elementList.size());
/*System.out.println(elementList.size());*/
for(Element element : elementList){
//分别输出子节点title,price,author的内容
String titleElement = element.element("title").getText().trim();
System.out.println(titleElement);
String priceElement = element.element("price").getText().trim();
System.out.println(priceElement);
String authorElement = element.element("author").getText().trim();
System.out.println(authorElement);
//子节点的id属性
String id = element.attributeValue("id");
System.out.println(id);
}
}
}
(四)将Document对象写入XML文件
- 文档中全为英文,不设置编码,直接写入的形式
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
- 文档中含有中文,设置编码格式写入的形式
package cn.itcast.andorid.copyOfDom4.j;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Demo04 {
public static void main(String[] args) throws Exception {
//创建dom4.j解析器
SAXReader saxReader = new SAXReader();
//创建InputStream对象,指向硬盘中的xml文件
InputStream is = new FileInputStream(new File("E:/book.xml"));
Document xmlDocument = saxReader.read(is);
/*
* 第一种方法
*
//将DOUCMENT对象存放入硬盘中,形成xml文件
XMLWriter writer = new XMLWriter(new FileWriter("e:/newbook.xml"));
writer.write(xmlDocument);
writer.close();
*
*/
//第二种方法
OutputFormat format = OutputFormat.createCompactFormat();
OutputStream os = new FileOutputStream(new File("e:/newbook.xml"));
XMLWriter xmlWriter = new XMLWriter(os, format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
(五)XPATH快速定位
若一个xml文档里有着多层次标签的时候,想要定位到某个标签的内容时,使用dom4.j只能够依次寻找从上到下,比较繁琐。因此,使用XPATH
1、XPATH是啥?
XPATH是一门在xml文档中查找信息的语言,可用来对其中的元素和属性进行遍历,简化了dom4.j查找节点的过程
2、XPATH语法
3、查询节点
(1)获取所有符合条件的节点:selectNode()返回一个List集合
(2)获取符合条件的单个节点:selectSingleNode(xpath)返回一个Node元素,一般需要转换成Element类型,若有多个出现的话,只取其中一个。