java 两种xml解析方式

DOM解析

DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

工具:Dom4j,可以在http://download.csdn.net/detail/qq_29815027/9849662下载,或者自行下载

使用步骤:

1)导入dom4j的核心包。 dom4j-1.6.1.jar

2)编写Dom4j读取xml文件代码

相关操作及代码:

Demo1

/**

 * 第一个写出内容到xml文档

 * @author APPle

 *

 */

public class Demo1 {

public static void main(String[] args) throws Exception{

//一、读取或创建一个Document对象

//读取day07项目的xm文件

Document doc = new SAXReader().read(new File("./src/contact.xml"));

//二、修改Document对象内容

//三、把修改后的Document对象写出到xml文档中

//指定文件输出的位置

FileOutputStream out = new FileOutputStream("e:/contact.xml");

//1.创建写出对象

XMLWriter writer = new XMLWriter(out);

//2.写出对象

writer.write(doc);

//3.关闭流

writer.close();

}

 

}

Demo2

/**

 * 讨论写出内容到xml文档的细节

 * @author APPle

 *

 */

public class Demo2 {

 

/**

 * @param args

 */

public static void main(String[] args) throws Exception{

Document doc = new SAXReader().read(new File("./src/contact.xml"));

//指定文件输出的位置

FileOutputStream out = new FileOutputStream("e:/contact.xml");

/**

 * 1.指定写出的格式

 */

OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候

//OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候

/**

 * 2.指定生成的xml文档的编码

 *    同时影响了xml文档保存时的编码  和  xml文档声明的encoding的编码(xml解析时的编码)

 *    结论: 使用该方法生成的xml文档避免中文乱码问题。

 */

format.setEncoding("utf-8");

//1.创建写出对象

XMLWriter writer = new XMLWriter(out,format);

//2.写出对象

writer.write(doc);

//3.关闭流

writer.close();

}

 

}

Demo3

/**

 * 修改xml内容

 * 增加:文档,标签 ,属性

 * 修改:属性值,文本

 * 删除:标签,属性

 * @author APPle

 *

 */

public class Demo3 {

 

/**

 * 增加:文档,标签 ,属性

 */

@Test

public void test1() throws Exception{

/**

 * 1.创建文档

 */

Document doc = DocumentHelper.createDocument();

/**

 * 2.增加标签

 */

Element rootElem = doc.addElement("contactList");

//doc.addElement("contactList");

Element contactElem = rootElem.addElement("contact");

contactElem.addElement("name");

/**

 * 3.增加属性

 */

contactElem.addAttribute("id", "001");

contactElem.addAttribute("name", "eric");

//把修改后的Document对象写出到xml文档中

FileOutputStream out = new FileOutputStream("e:/contact.xml");

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("utf-8");

XMLWriter writer = new XMLWriter(out,format);

writer.write(doc);

writer.close();

}

/**

 * 修改:属性值,文本

 * @throws Exception

 */

@Test

public void test2() throws Exception{

Document doc = new SAXReader().read(new File("./src/contact.xml"));

/**

 * 方案一: 修改属性值   1.得到标签对象 2.得到属性对象 3.修改属性值

 */

//1.1  得到标签对象

/*

Element contactElem = doc.getRootElement().element("contact");

//1.2 得到属性对象

Attribute idAttr = contactElem.attribute("id");

//1.3 修改属性值

idAttr.setValue("003");

*/

/**

 * 方案二: 修改属性值

 */

//1.1  得到标签对象

/*

Element contactElem = doc.getRootElement().element("contact");

//1.2 通过增加同名属性的方法,修改属性值

contactElem.addAttribute("id", "004");

*/

/**

 * 修改文本 1.得到标签对象 2.修改文本

 */

Element nameElem = doc.getRootElement().

element("contact").element("name");

nameElem.setText("李四");

FileOutputStream out = new FileOutputStream("e:/contact.xml");

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("utf-8");

XMLWriter writer = new XMLWriter(out,format);

writer.write(doc);

writer.close();

}

/**

 * 删除:标签,属性

 * @throws Exception

 */

@Test

public void test3() throws Exception{

Document doc = new SAXReader().read(new File("./src/contact.xml"));

/**

 * 1.删除标签     1.1 得到标签对象  1.2 删除标签对象    

 */

// 1.1 得到标签对象

/*

Element ageElem = doc.getRootElement().element("contact")

.element("age");

//1.2 删除标签对象

ageElem.detach();

//ageElem.getParent().remove(ageElem);

*/

/**

 * 2.删除属性   2.1得到属性对象  2.2 删除属性

 */

//2.1得到属性对象

//得到第二个contact标签

Element contactElem = (Element)doc.getRootElement().

elements().get(1);

//2.2 得到属性对象

Attribute idAttr = contactElem.attribute("id");

//2.3 删除属性

idAttr.detach();

//idAttr.getParent().remove(idAttr);

FileOutputStream out = new FileOutputStream("e:/contact.xml");

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("utf-8");

XMLWriter writer = new XMLWriter(out,format);

writer.write(doc);

writer.close();

}

}

Xml文档示例:

<?xml version="1.0" encoding="UTF-8"?>

<contactList>

<contact id="001" name="1">

<name>张三</name>

<age>20</age>

<phone>134222223333</phone>

<email>zhangsan@qq.com</email>

<qq>432221111</qq>

</contact>

<contact id="003" sid="1">

<name>lisi</name>

<age>20</age>

<phone>134222225555</phone>

<email>lisi@qq.com</email>

<qq>432222222</qq>

</contact>

<extra>

11111

</extra>

</contactList>

SAX解析

SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

工具:内置在jdk

核心的API

SAXParser类: 用于读取和解析xml文件对象

parseFile f, DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件。

参数二: DefaultHandlerSAX事件处理程序。使用DefaultHandler的子类

例如:{

     1.创建SAXParser对象  

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

                  2.调用parse方法

parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

} [一个类继承class 类名(extends DefaultHandler  在调用是创建传进去

 

DefaultHandler类的API:

void startDocument()  :  在读到文档开始时调用

void endDocument()  :在读到文档结束时调用

void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用

void endElement(String uri, String localName, String qName)   :读到结束标签时调用

void characters(char[] ch, int start, int length)   读到文本内容时调用

 

============DOM解析    vs   SAX解析 ========

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(NodeElementAttribute,Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

相关操作及代码:

Demo1

/**

 * 第一个SAX读取xml文件程序

 * @author APPle

 *

 */

public class Demo1 {

 

public static void main(String[] args) throws Exception{

//1.创建SAXParser对象

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

//2.调用parse方法

/**

 * 参数一: xml文档

 * 参数二: DefaultHandler的子类

 */

parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

}

 

}

/**

 * SAX处理程序(如何解析xml文档)

 * @author APPle

 *

 */

public class MyDefaultHandler extends DefaultHandler {

/**

 * 开始文档时调用

 */

@Override

public void startDocument() throws SAXException {

System.out.println("MyDefaultHandler.startDocument()");

}

/**

 * 开始标签时调用

 * @param qName: 表示开始标签的标签名

 * @param attributes: 表示开始标签内包含的属性列表

 */

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

System.out.println("MyDefaultHandler.startElement()-->"+qName);

}

/**

 * 结束标签时调用

 * @param qName: 结束标签的标签名称

 */

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

System.out.println("MyDefaultHandler.endElement()-->"+qName);

}

/**

 * 读到文本内容的时调用

 * @param ch: 表示当前读完的所有文本内容

 * @param start: 表示当前文本内容的开始位置

 * @param length: 表示当前文本内容的长度

 * char[](                                       张三              20)   100

 *                              98 2   

 */

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

//得到当前文本内容

String content = new String(ch,start,length);

System.out.println("MyDefaultHandler.characters()-->"+content);

}

/**

 * 结束文档时调用

 */

@Override

public void endDocument() throws SAXException {

System.out.println("MyDefaultHandler.endDocument()");

}

}

Demo2

/**

 * 读取contact.xml文件,完整输出文档内容

 * @author APPle

 *

 */

public class Demo2 {

 

public static void main(String[] args)throws Exception {

//1.创建SAXParser

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

//2.读取xml文件

MyDefaultHandler2 handler = new MyDefaultHandler2();

parser.parse(new File("./src/contact.xml"), handler);

String content = handler.getContent();

System.out.println(content);

}

 

}

/**

 * SAX处理器程序

 * @author APPle

 */

public class MyDefaultHandler2 extends DefaultHandler {

//存储xml文档信息

private StringBuffer sb = new StringBuffer();

//获取xml信息

public String getContent(){

return sb.toString();

}

 

/**

 * 开始标签

 */

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

sb.append("<"+qName);

//判断是否有属性

if(attributes!=null){

for(int i=0;i<attributes.getLength();i++){

//得到属性名称

String attrName = attributes.getQName(i);

//得到属性值

String attrValue = attributes.getValue(i);

sb.append(" "+attrName+"=\""+attrValue+"\"");

}

}

sb.append(">");

}

/**

 * 文本内容

 */

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

//得到当前读取的文本

String content = new String(ch,start,length);

sb.append(content);

}

/**

 * 结束标签

 */

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

sb.append("</"+qName+">");

}

}

Demo3

/**

 * 使用sax解析把 xml文档封装成对象

 * @author APPle

 *

 */

public class Demo3 {

 

public static void main(String[] args)throws Exception {

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

MyDefaultHandler3 handler = new MyDefaultHandler3();

parser.parse(new File("./src/contact.xml"), handler);

List<Contact> list = handler.getList();

for (Contact contact : list) {

System.out.println(contact);

}

}

}

 

public class Contact {

private String id;

private String name;

private String age;

private String phone;

private String email;

private String qq;

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 getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getQq() {

return qq;

}

public void setQq(String qq) {

this.qq = qq;

}

@Override

public String toString() {

return "Contact [age=" + age + ", email=" + email + ", id=" + id

+ ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]";

}

}

 

/**

 * SAX处理程序

 * @author APPle

 *

 */

public class MyDefaultHandler3 extends DefaultHandler {

//存储所有联系人对象

private List<Contact> list = new ArrayList<Contact>();

public List<Contact> getList(){

return list;

}

//保存一个联系人信息

private Contact contact;

/**

 * 思路:

 * 1)创建Contact对象

 *  2)把每个contact标签内容存入到Contact对象

 *  3)把Contact对象放入List

 */

//用于临时存储当前读到的标签名

private String curTag;

 

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

curTag = qName;

//读取到contact的开始标签创建Contact对象

if("contact".equals(qName)){

contact = new Contact();

//设置id

contact.setId(attributes.getValue("id"));

}

}

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

//当前文本内容

String content = new String(ch,start,length);

if("name".equals(curTag)){

contact.setName(content);

}

if("age".equals(curTag)){

contact.setAge(content);

}

if("phone".equals(curTag)){

contact.setPhone(content);

}

if("email".equals(curTag)){

contact.setEmail(content);

}

if("qq".equals(curTag)){

contact.setQq(content);

}

}

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

//设置空时为了避免空格换行设置到对象的属性中

curTag = null;

//读到contact的结束标签放入List

if("contact".equals(qName)){

list.add(contact);

}

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值