JavaWeb笔记之XML解析

                        XML基础

一.什么是XML?

XML:eXtensible Markup Language 可扩展标记语言 ,W3C推出至今,也就是version="1.0",可扩展:所有的标签都是自定义的。 

二.XML作用:

数据存储,配置文件,数据传输(不常用)  

三.html与xml区别:

         1.html语法松散,xml语法严格

         2.html做页面展示,xml做数据存储

         3.html所有标签都是预定义的,xml所有标签都是自定义的

四.XML语法

        1.文档声明:

            * 必须写在xml文档的第一行。

            * 写法:<?xmlversion="1.0" ?>

            * 属性:   

                * version:版本号 固定值 1.0

                * encoding:指定文档的码表。默认值为 iso-8859-1

                * standalone:指定文档是否独立  yes 或 no

        2.元素:xml文档中的标签

            ** 文档中必须有且只能有一个根元素

            * 元素需要正确闭合。<body></body><br/>

            * 元素需要正确嵌套

            * 元素名称要遵守:

                * 元素名称区分大小写

                * 数字不能开头

       

        3.文本:

            * 转义字符:&gt;

            * CDATA: 里边的数据会原样显示

                *  <![CDATA[ 数据内容 ]]>

               

        4.属性

            * 属性值必须用引号引起来。单双引号都行

        5.注释

            <!-- -->

        6.处理指令:现在基本不用

            <?xml-stylesheettype="text/css" href="1.css"?>

           

    五.xml约束:

        即xml的书写规则,DTD和schema

    1.dtd分类:(定义简单,但是对于每个属性的控制不足)

        * 内部dtd:在xml内部定义dtd

        * 外部dtd:在外部文件中定义dtd

        * 本地dtd文件:<!DOCTYPE students SYSTEM "student.dtd">

        * 网络dtd文件:<!DOCTYPE students PUBLIC "名称空间"  "student.dtd">

DTD定义XML文件案例:

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

<!DOCTYPE

       用户 [

       <!ELEMENT 用户 (用户名,性别,爱好)>

       <!ELEMENT 用户名 (#PCDATA)>

       <!ELEMENT 性别   (#PCDATA)>

       <!ELEMENT 爱好 (#PCDATA)>

       ]>

 

 

 <用户>

   <用户名>大黄1</用户名>

   <性别>公</性别>

   <爱好>吃骨头</爱好>

 

</用户>

    2.schema:(定义比较复杂,但是对每一个属性的规范很清晰)

        导入xsd约束文档:

            1、编写根标签

            2、引入实例名称空间xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            3、引入名称空间 xsi:schemaLocation="http://项目网站域名(www.baidu.com)/xml student.xsd"

            4、引入默认的名称空间

SCHEMA定义XML案例:

    <?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

    elementFormDefault="qualified" targetNamespace="http://www.baidu.com"

    xmlns="http://www.baidu.com">

    //定义一个主题

    <xs:element name="用户组" type="yhzType"></xs:element>

    //complexType定义复杂类型可以包含其他主题

    <xs:complexType name="yhzType">

       <xs:sequence maxOccurs="3">

           <xs:element name="用户" type="yhType"></xs:element>

       </xs:sequence>

       //attribute属性类型定义

       <xs:attribute name="userId"type="xs:integer" use="required"></xs:attribute>

    </xs:complexType>

    <xs:complexType name="yhType">

       //sequence有序子主题

       <xs:sequence>

           <xs:element name="用户名" type="usernameType"></xs:element>

           <xs:element name="性别" type="sexType"></xs:element>

           <xs:element name="年龄" type="ageType"></xs:element>

           <xs:element name="爱好" type="hbsType"></xs:element>

       </xs:sequence>

    </xs:complexType>

    <xs:complexType name="hbsType">

       <xs:sequence>

           <xs:element name="爱好一" type="xs:string"></xs:element>

           <xs:element name="爱好二" type="xs:string"></xs:element>

           <xs:element name="爱好三" type="xs:string"></xs:element>

       </xs:sequence>

    </xs:complexType>

    //主题的简单类型可以定义这个主题属性为一段正则,一个枚举器,一个数值范围等

    <xs:simpleType name="usernameType">

       //restriction规定属性类型

       <xs:restriction base="xs:string">

           <xs:pattern value="\w{6,10}"></xs:pattern>

       </xs:restriction>

    </xs:simpleType>

    <xs:simpleType name="sexType">

       <xs:restriction base="xs:string">

           <xs:enumeration value=""></xs:enumeration>

           <xs:enumeration value=""></xs:enumeration>

       </xs:restriction>

    </xs:simpleType>

    <xs:simpleType name="ageType">

       <xs:restriction base="xs:integer">

           <xs:minInclusive value="1"></xs:minInclusive>

           <xs:maxInclusive value="100"></xs:maxInclusive>

       </xs:restriction>

    </xs:simpleType>

</xs:schema>

                        XML解析

SAX(最原始的xml文件解析方法,逐行扫描文档,一边扫描一边解析)

sax分析器在对xml文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对xml文档的访问.

因为事件触发是有时序性的,所以sax分析器提供的是一种对xml文档的顺序访问机制,对于已经分析过的部分,

不能再重新倒回去处理.此外,它也不能同时访问处理2个tag.

sax分析器在实现时,只是顺序地检查xml文档中的字节流,判断当前字节是xml语法中的哪一部分,检查是否符合

xml语法并且触发相应的事件.对于事件处理函数的本身,要由应用程序自己来实现. SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。

同DOM分析器相比,sax分析器对xml文档的处理缺乏灵活性,但对于只访问xml文档中的数据而不改变应用程序

来说,sax分析器的效率会很高.

sax对内存要求也比较低.

优点:1、无需将整个文档加载到内存中,所以内存消耗少.

      2 、推模型允许注册多个contentHandler.

缺点:1、没有内置的文档导航支持.

      2、不能随机访问xml文档.

      3、不支持原地修改xml.

      4、不支持名字空间作用域.

适合:对xml文档读取数据

 

 基本使用步骤:

try{

         SAXParserFactory factory =SAXParserFactory.newInstance();//1

          SAXParserparser = factory.newSAXParser();//2

          XMLReaderreader = parser.getXMLReader();//3

          reader.setContentHandler(new DefaultHandler(){

         @Override

         public void startDocument() throwsSAXException {

                   super.startDocument();

                   System.out.println("开始解析整个XML文档。。");

         }

@Override

         public void endDocument() throws SAXException{

                  super.endDocument();

                   System.out.println("结束解析整个XML文档。。");

                   System.out.println(users);

         }

 

@Override

publicvoid startElement(String uri, String localName,

         String qName, Attributes attributes)

         throws SAXException {

                   super.startElement(uri,localName, qName, attributes);

                   System.out.println("开始解析某个元素标签。。  "+qName);

                   elementName=qName;

                   if("用户".equals(elementName)){

                            user=new User();

                            users.add(user);

                            }

                   }

@Override

publicvoid endElement(String uri, String localName,

         String qName) throws SAXException {

                   super.endElement(uri,localName, qName);

                   System.out.println("结束解析某个元素标签。。"+localName+"  "+qName);

                   elementName="";

                                    

                   }

@Override

publicvoid characters(char[] ch, int start, int length)

         throws SAXException {

                   super.characters(ch, start,length);

                   if(!"".equals(elementName)){                     

                            String value=newString(ch,start,length);

                            if(!"".equals(value.trim())){

                            System.out.println(elementName+": "+value);

                   if("用户名".equals(elementName)){

                            user.name=value;

                                     }

                   if("年龄".equals(elementName)){

                                                                                                                                   user.age=Integer.parseInt(value);

                                     }

                   if("性别".equals(elementName)){

                            user.sex=value;

                            }}}}});//4

 reader.parse(getServletContext().getRealPath("/test2.xml"));//5

}catch(Exceptione){

         e.printStackTrace();

                   }

DOM(不常用,太复杂,整个xml转换为DOM树加载到内存中)

DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。也就是说,通过DOM树,应用程序可以对XML文档进行随机访问。这种访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容.用DOM解析模型编程容易,开发人员只需要调用建树的指令,然后利用navigationAPIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

优点:1、丰富的API集合,可以轻松导航.

       2、 整个DOM树加载到内存,允许随机访问.

缺点:1、整个xml文档必须一次解析完.

       2、整个DOM树都加载到内存中,内存要求高.

       3、一般的DOM节点对于必须为所有节点创建对象的对象类型绑定不太理想.

适用:对xml文档修改数据

JDOM(不推荐使用)

JDOM是处理xml的纯javaapi.使用具体类而不是接口.JDOM具有树的遍历,又有SAX的java规则.JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

优点:1、是基于树的处理xml的javaapi,把树加载到内存中.

       2、没有向下兼容的限制,所以比DOM简单.

       3、速度快.

       4、具有SAX的java规则.

缺点:1、不能处理大于内存的文档.

       2、JDOM表示XML文档逻辑模型,不能保证每个字节真正变换.

       3、 针对实例文档不提供DTD与模式的任何实际模型.

       4、 不支持于DOM中相应遍历包.

适用:自行选择

DOM4J(推荐使用)

DOM4J有更复杂的api,所以dom4j比jdom有更大的灵活性.DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.

优点:1、灵活性最高

      2、易用性和功能强大、性能优异

缺点:1、复杂的api

      2、移植性差

适用:自行选择

基本步骤:将xml文件的数据解析放到一个User对象中方便以后使用

1.   导包:dom4j-1.6.3.jar

2.   创建与xml文件中属性对象的User实体类

3.   编写servlet解析

SAXReader reader = new SAXReader();

List<User> users=new ArrayList<User>();

try {

                //路径出错

              Documentdocument = reader.read(getServletContext().getRealPath("/test.xml"));

              Elementroot = document.getRootElement();

             

              for (Iterator it = root.elementIterator(); it.hasNext(); ) {

                   Element element = (Element) it.next();

                   Useruser=new User();

                   users.add(user);

                   System.out.println(element.getName());

                   for ( Iterator itUser = element.elementIterator(); itUser.hasNext(); ) {

                  Elementelement1 = (Element) itUser.next();

                    System.out.println(element1.getName()+":"+element1.getText());

                    if("用户名".equals(element1.getName())){

                     user.name=element1.getText();

                  }

                  if("年龄".equals(element1.getName())){

                     user.age=Integer.parseInt(element1.getText());

                  }

                  if("性别".equals(element1.getName())){

                     user.sex=element1.getText();

                  }

                 

                   }  

              }

              System.out.println(users);

             

           }catch (DocumentException e) {

              // TODO Auto-generated catchblock

              e.printStackTrace();

        }

猜你喜欢

转载自blog.csdn.net/DaySurprise/article/details/78630541