您的位置:首页 > 编程语言 > Java开发

Java XML解析

2016-04-18 21:59 567 查看

Java XML解析

DOM解析

DOM(Document Object Model,文档对象模型)。

优点:将XML文档转换成一个对象模型集合,可以在任何时候访问XML文档中的任何一部分数据

缺点:当文档比较大或者结构比较复杂时,对内存的需求就比较高。

DOM解析有4个核心的操作接口:

Document:此接口代表整个XML文档,表示整颗DOM树的根。



Node:每一个Node接口代表了DOM树种的一个节点



NodeList:此接口表示一个节点的集合



NamedNodeMap:表示一组节点和其唯一名称对应的一一对应关系。主要用于属性节点的表示。

DOM解析步骤

建立
DocumentBuilderFactory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();


建立
DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();


建立
Document
Document document = db.parse("要读取的文件路径");


建立
NodeList
NodeList nl = document.getElementsByTagName("读取节点");


进行XML信息读取

//创建一个DocumentdBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {
//创建一个DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder的parse方法解析books.xml文件
Document document = db.parse("books.xml");
//获取book节点的集合
NodeList bookList = document.getElementsByTagName("book");
//遍历每一个book节点
for(int i=0; i <bookList.getLength(); i++)
{
/*
//通过item(i)方法获取一个book节点,nodelist的索引值从0开始
Node book = bookList.item(i);
//获取book节点的所有属性值
NamedNodeMap attrs = book.getAttributes();
//遍历
for(int j=0; j < attrs.getLength(); j++)
{
//获取属性
Node attr = attrs.item(j);
System.out.println("属性名:"+attr.getNodeName()+"属性值:"+attr.getNodeValue());
}
*/

/*
* 前提:已经知道book节点有且只能有1个id属性
* 将book节点进行强制类型转换,转换成Element类型
*/
Element book = (Element)bookList.item(i);
String attrValue = book.getAttribute("id");
System.out.println("id->"+attrValue);

System.out.println("=======");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException | IOException e) {
e.printStackTrace();
}


DOM XML文件输出

如果要将XML文件,保存在硬盘山,需要使用到的类:

TransformerFactory 获取一个Transformer类的实例对象

Transformer

DOMSource 接收Document对象

StreamResult 指定要使用的输出流对象(可以向文件输出,也可以向指定的输出流输出)

//建立DocumentBuilderFactory,用于获取DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通过DocumentBuilderFactory取得DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (Exception e) {
e.printStackTrace();
}
//定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Document doc = null;
doc = builder.newDocument();
//建立各个操作节点
Element addresslist = doc.createElement("addresslist");
Element linkman = doc.createElement("linkman");
Element name = doc.createElement("name");
Element email = doc.createElement("email");
//设置节点的文本内容
name.appendChild(doc.createTextNode("张三"));
email.appendChild(doc.createTextNode("zhangsan@123.com"));
//设置节点关系
linkman.appendChild(name);
linkman.appendChild(email);
addresslist.appendChild(linkman);
doc.appendChild(addresslist);
//输出文档到文件中
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = null;
try {
t = tf.newTransformer();
} catch (Exception e) {
e.printStackTrace();
}
t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//设置编码
DOMSource source = new DOMSource(doc);//输出文档
StreamResult result = new StreamResult(new File("output.xml"));
try {
t.transform(source, result);//输出
} catch (Exception e) {
e.printStackTrace();
}


最终创建的xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<addresslist>
<linkman>
<name>张三</name>
<email>zhangsan@123.com</email>
</linkman>
</addresslist>


SAX解析

SAX(Simple APIs for XML,操作XML的简单接口),与DOM操作不同,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。使用SAX解析器进行操作时会触发一系列事件。



如何使用SAX解析?

1. 编写一个
SAX
解析器,该类继承自
DefaultHandler


package com.imooc.test;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

//定义SAX解析器
public class MySAX extends DefaultHandler {

//文档开始
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
}

//文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("\n 文档读取结束...");
}

//元素开始
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("<");
System.out.println(qName);//输出元素名称
if(attributes != null){//取得全部的属性
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(" "+attributes.getQName(i)+"=\""
+attributes.getValue(i)+"\" ");
}
}
System.out.println(">");
}

//取出元素内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println(new String(ch,start, length));
}

//元素结束
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("</");
System.out.println(qName);
System.out.println(">");
}

}


还需要
SAXParserFactory
SAXParser


//建立SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//构建解析器
SAXParser parser = factory.newSAXParser();
//解析XML使用HANDLER
parser.parse("books.xml", new MySAX());


DOM解析与SAX解析的区别



JDOM

JDOM=DOM修改文件的优点+SAX读取快速的优点

DOM4J

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java xml