一、概述

  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. Linux强制杀进程命令行工具

    需求, 有时候我们会有手动启动程序, 但是又在后台, 没有像服务那样有start, 和stop的程序, 这时候需要用强制杀进程方式 涉及工具, awk, sed, xargs, kill 需求一: 已 ...

  2. Java如何显示线程状态?

    在Java编程中,如何显示线程状态? 以下示例演示如何使用Thread类的isAlive()和getStatus()方法显示线程的不同状态. package com.yiibai; class MyT ...

  3. 逻辑卷管理LVM 扩容LV容量实例(一)

    实验环境: 一台Linux 服务器添加两块硬盘,一块硬盘容量30G,另一块硬盘容量50G,采用VMware Workstation虚拟机进行模拟实验. 30G硬盘先分成一个分区,分区大小为25G,再创 ...

  4. bioperl 格式化genebank的输出

    代码如下: use Bio::SeqIO; use Bio::DB::GenBank; use Bio::DB::Query::GenBank; my $db_obj = Bio::DB::GenBa ...

  5. .net framework 4.0上跑webapi 1.0

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web AP ...

  6. add a private constructor to hide the implicit public one(Utility classes should not have public constructors)

    sonarlint提示add a private constructor to hide the implicit public one Utility classes should not have ...

  7. Unity3d 动态加载材质方法

    Texture img = (Texture)Resources.Load("LedPicture"); GameObject.Find("Led").rend ...

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

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

  9. Linux服务器svn与项目同步

    命令:svn checkout svn://192.168.67.131/trunk/w1

  10. Oracle性能调整ASH,AWR,ADDM

    ASH (Active Session History)ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成.ASH ...