一、概述

  XML全称为可扩展的标记语言。主要用于描述数据和用作配置文件。

  XML文档在逻辑上主要由一下5个部分组成:

  • XML声明:指明所用XML的版本、文档的编码、文档的独立性信息
  • 文档类型声明:指出XML文档所用的DTD
  • 元素:由开始标签、元素内容和结束标签构成
  • 注释:以<!--开始,以-->结束,用于对文档中的内容起一个说明作用
  • 处理指令:通过处理指令来通知其他应用程序来处理非XML格式的数据,格式为<?xml-stylesheet href="hello.css" type="text/css"?>

  XML文档的根元素被称为文档元素,它和在其外部出现的处理指令、注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。

二、XML文档解析

   在解析XML文档时,通常是利用现有的XML解析器对XML文档进行分析,应用程序通过解析器提供的API接口得到XML数据。

  XML解析方式分为两种:DOM和SAX:

  DOM:用来解析相对较小的XML文件,容易增删改查。DOM的核心是节点,DOM在解析XML文档时,将组成文档的各个部分映射为一个对象,这个对象就叫做节点。使用DOM解析XML文档,需要将读入整个XML文档,然后在内存中创建DOM树,生成DOM树上的每个节点对象。

<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<作者>李阳</作者>
<价格>39元</价格>
<出版社>高等教育出版社</出版社>
</书>
<书>
<作者>宋吉</作者>
<价格>40元</价格>
<出版社>人民出版社</出版社>
</书>
</书架>

  使用DOM解析上述XML文档,代码如下:

package com.test.xml;
import java.io.File;
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 Demo
{
public static void main(String args[])
{
//得到DOM解析器工厂类的实例
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try
{
//得到dom的解析器对象
DocumentBuilder db=dbf.newDocumentBuilder();
//解析XML文档,得到代表文档的document对象
File file=new File("D:\\Eclipse\\workSpace\\day_050401\\src\\book.xml");
Document doc=db.parse(file); //以文档顺序返回标签名字为书的所有后代元素
NodeList nl=doc.getElementsByTagName("书"); for(int i=0;i<nl.getLength();i++)
{
Element elt=(Element) nl.item(i);
Node eltAuthor=elt.getElementsByTagName("作者").item(0);
Node eltPricer=elt.getElementsByTagName("价格").item(0);
Node eltPublish=elt.getElementsByTagName("出版社").item(0); String Author=eltAuthor.getFirstChild().getNodeValue();
String Pricer=eltPricer.getFirstChild().getNodeValue();
String Publish=eltPublish.getFirstChild().getNodeValue(); System.out.println("-------书籍信息"+(i+1)+"-------");
System.out.println("作者:"+Author);
System.out.println("价格:"+Pricer);
System.out.println("出版社:"+Publish);
} }
catch (ParserConfigurationException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (SAXException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
} }
}

  执行结果如下: 

 

  SAX:内存消耗较小,适合读取操作。SAX是一种基于事件驱动的API,利用SAX解析XML文档涉及解析器和事件处理器两个部分。解析器负责读取XML文档,并向事件处理器发送事件,事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

  使用SAX解析XML文档,代码如下:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
class Book
{
private String name;
private String author;
private String price;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
public String getPrice()
{
return price;
} public void setPrice(String price)
{
this.price = price; } }
public class Demo extends DefaultHandler
{
private List list=new ArrayList();
private String currentTag;
private Book book;
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException
{
currentTag=name;
if("书".equals(currentTag))
{
book=new Book();
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
if("出版社".equals(currentTag))
{
String name=new String(ch,start,length);
book.setName(name);
}
if("作者".equals(currentTag))
{
String author=new String(ch,start,length);
book.setAuthor(author);
}
if("价格".equals(currentTag))
{
String price=new String(ch,start,length);
book.setPrice(price);
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException
{
if(name.equals("书"))
{
list.add(book);
book=null;
}
currentTag=null;
}
public List getBooks()
{
return list;
}
public static void main(String []args)
{
//1.创建解析工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sp=null;
try
{
//2.得到解析器
sp=factory.newSAXParser();
//3、得到读取器
XMLReader reader=sp.getXMLReader();
File file=new File("D:\\Eclipse\\workSpace\\day_050401\\src\\book.xml");
//4.设置内容处理器
Demo handle=new Demo();
//reader.setContentHandler(handle);
sp.parse(file,handle);
//5.读取xml文档内容
List<Book> list=handle.getBooks();
for(int i=0;i<list.size();i++)
System.out.println(list.get(i).getAuthor()+"----"+list.get(i).getName()+"-----"+list.get(i).getPrice());
}
catch (ParserConfigurationException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (SAXException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}

  运行结果如下:

三、dom4j解析XML文档

  dom4j也是一种用于解析XML文档的开放源代码的Java库。下载地址http://sourceforge.net/projects/dom4j/

  使用dom4j进行读取XMl文档操作,代码如下:

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.security.KeyStore.Entry.Attribute; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test; public class Demo
{
//读取xml文件第二本书的出版社
@Test
public void read()
{
SAXReader reader = new SAXReader();
try
{
Document document = reader.read("C:\\Users\\Administrator\\Desktop\\book.xml");
Element root =document.getRootElement();
Element book=(Element)root.elements("书").get(1);
String value=book.element("出版社").getText();
System.out.println(value);
}
catch (DocumentException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} //在第二本书上添加一个书名:<书名>平凡的世界</书名>
@Test
public void add() throws DocumentException, IOException
{
SAXReader reader = new SAXReader();
Document document = reader.read("C:\\Users\\Administrator\\Desktop\\book.xml"); Element book=(Element) document.getRootElement().elements("书").get(1);
book.addElement("书名").setText("平凡的世界");
//更新内存
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\book.xml"),"UTF-8"));
writer.write(document);
writer.close();
}
}

  运行结果:

  

  PS:如果你的项目经常需要更换解析器,建议使用DOM和SAX,这样当更换解析器时不需要更改任何代码,如果没有这样的需求,建议使用dom4j,简单而又强大。

XML的基本用法的更多相关文章

  1. [转]Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法

    转载:http://blog.csdn.net/harvic880925/article/details/39996643 前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的 ...

  2. android.view.animation(1) - alpha、scale、translate、rotate、set的xml属性和用法(转)

    一.ScaleAnimation ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, floa ...

  3. 转:自定义控件三部曲之动画篇——alpha、scale、translate、rotate、set的xml属性及用法

    第一篇: 一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resour ...

  4. python学习第四十九天XML模块的用法

    xml是实现不通语言或程序之间进行数据交换的协议,跟json差不多,但是json用起来简单,还没诞生json,以前都是用xml,下面讲述XML模块的用法. 1,导入xml模块 import xml 2 ...

  5. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  6. Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法

    一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resources&g ...

  7. 小白的Python之路 day5 模块XML特点和用法

    模块XML的特点和用法 一.简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今 ...

  8. SQLServer中sql for xml path 的用法

    我们通常需要获取一个多行的某个字段拼出的字符串,我们可以使用for xml path进行处理:下面将介绍for xml path的具体用法: 创建测试表&插入测试数据 在数据库中新增测试表 C ...

  9. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

    前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随 ...

  10. 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...

随机推荐

  1. Zend Framework2 入门教程(转)

    转载自: http://my.oschina.net/lai1362000/blog/201301 重申:这本书作者的截图我都放上去了,没侵权啊. 别问那么多,我只是一个安静的搬砖工. 摘要 Zend ...

  2. unity提高----------射线使用【unity3d 怎样获得当前鼠标点击的对象】

    unity3d 怎样获得当前鼠标点击的对象 最佳答案   var ray = Camera.main.ScreenPointToRay (Input.mousePosition);var hit : ...

  3. Maven使用国内镜像

    ^_^ <mirrors> <!-- mirror | Specifies a repository mirror site to use instead of a given re ...

  4. winform 应用log4net做日志记录到mysql

    1.nuget装log4net 2.nuget控件台装 mysql.data Install-Package mysql.data -version 6.8.3 (太高的版本用不了,切记) 3.修改a ...

  5. 设计模式1-单例模式(Singletion)

    单例模式(Singletion):保证一个类仅有一个实例,并提供一个访问该实例的全局访问点. 单例模式主要作用是保证唯一的实例,可以严格地控制客户端怎样访问该实例以及何时访问它.可以简单的理解为对唯一 ...

  6. eclipse 安装图形插件(图形化编程)

    打开eclipse 查看什么版本 ,我的是Oxygen help --> install newsoftware 打开地址 http://www.eclipse.org/windowbuilde ...

  7. android 静默安装 卸载 资料汇总

    1. android + eclipse + 后台静默安装(一看就会) 2. 适用于android1.5以下版本apk静默安装 3. error: INSTALL_FAILED_SHARED_USER ...

  8. XcenServer和XcenCenterter的安装

    XcenServer安装 安装在客户端(作为服务器的电脑) 准备工具:U盘(4G以上).uiso9(iso刻录) 步骤一:下载ISO文件, 下载地址:https://xenserver.org/ove ...

  9. 内存管理 初始化(四)mem_init bootmem 迁移至伙伴系统

    mm_init中执行mem_init,将原通过bootmem分配器管理的低端内存 及  通过meminfo得知的高端内存释放到伙伴系统中,最后bootmem位图本身占用的低端内存物理页也被释放进伙伴系 ...

  10. koa使用koa-passport实现路由进入前登录验证

    现在的项目需求很简单,当进入一个页面的时候,如果没登录,则跳转到登录页面,如果登录了则直接到对应页面. koa2写的项目,使用koa-passport,koa-session,根据koa-passpo ...