XML的基本用法

一、概述

  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,简单而又强大。

时间: 2024-10-13 14:43:24

XML的基本用法的相关文章

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

XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式 http://blog.csdn.net/gdjlc/article/details/11374787 2013-09-08 12:16 2824人阅读 评论(0) 收藏 举报 分类: XML(5) 版权声明:本文为博主原创文章,未经博主允许不得转载. XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合

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

前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随时沟通的时候,总会发来一条条的鼓励短信,让我不自主的开始内疚.哎,多么可爱的用户,多么无耐的现实. 相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 一.概述 Android

Android自定义控件:动画类----alpha、scale、translate、rotate、set的xml属性及用法

一.概述 Android的animation由四种类型组成:C.scale.translate.rotate,对应android官方文档地址:<Animation Resources> 动画在XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 动作定义文件应该存放在res/anim文件夹下,访问时采用R.anim.XXX.xml的方式,位置如图: 二.下面我们逐个讲讲每个标签的属性

ajax返回的两种数据类型xml和json用法

用xml传单个数据 首先在servlet类里面写好要传的数据,Dog是模拟从数据库中提取的内容, 用response.getwrite().append()传回数据,要注意表头<?xml version='1.0'?>不能写错,根是唯一的 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Aut

XML的基本用法(转)

一.概述 XML全称为可扩展的标记语言.主要用于描述数据和用作配置文件. XML文档在逻辑上主要由一下5个部分组成: XML声明:指明所用XML的版本.文档的编码.文档的独立性信息 文档类型声明:指出XML文档所用的DTD 元素:由开始标签.元素内容和结束标签构成 注释:以<!--开始,以-->结束,用于对文档中的内容起一个说明作用 处理指令:通过处理指令来通知其他应用程序来处理非XML格式的数据,格式为<?xml-stylesheet href="hello.css"

Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)

一个表,然后语句如下 --查询 select id, name=stuff((select ','+name from tb where id=t.id for xml path('')),1,1,'') from tb t group by id 结果如下: 分组的时候 注意看清 id=t.id  .错误的情况会把所有的列加起来.非常尴尬.

&lt;经验杂谈&gt;C#/.Net中xml的Serialization序列化与DeSerializetion反序列化

1.先讲概念:.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML.  本文列出了最常用的方法和特性,涵盖日常大部分的转换工作,希望大家在工作中快速上手.为了给大家直观的印象,这里给出具体的使用代码,

xStream完美转换XML、JSON

xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 它们都完美支持JSON,但是对xml的支持还不是很好.一定程度上限制了对Java对象的描述,不能让xml完全体现到对Java对象的描述.这里将会介绍xStream对JSON.XML的完美支持.xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点.属性的描述.以及对JSON也支持,只需要提供

使用 SQL的 for xml path来进行字符串拼接

本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据. 我的讲解步骤: 1:构造初始数据 2:提出问题 3:简单介绍FOR XML PATH 4:解答问题 1.构造初始数据 举出一个经典的学生课程例子,共有学生.课程与学生课程三张表. 表1:Student student_id student_name 1 张三 2 李四 3 王五 表2:Course course_id course_name 1 语言