XML解析

 XML

1.XML介绍

XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言

Html中的标记(标签)是预定义好的

Xml中的标记需要自定义   <name></name><></>

Xml有两个版本1.0   1.1

实际开发用的是1.0,    1.1不能向下兼容

2.xml应用

l Xml主要用于传输数据

l Xml可以表示生活中存在的一些数据关系

l Xml用于配置文件  (web.xmlstruts.xml

3.XML语法

  **XML的文档声明

    创建XML文件,它的后缀是.xml

    文档的声明:<?xml version="1.0" encoding="gb2312"?>必须放在第一行第一列

       ***version:表示的是版本号.目前XML有两个版本:1.01.11.1版本它不能向下兼容

       ***encoding:表示的是编码方式GBKutf-8ISO8859-1(不支持中文)gb2312

       ***standalone:表示是否可以连接外部文件 yes/no。 若值是 ”yes” 表示没有呼叫外部文件,若值是 ”no” 则表示有呼叫外部

    注意:保存编码方式要和系统默认的编码方式一致,否则会出现输入中文内容的时候,会出现乱码

  **元素(标签)的定义

      ***元素是成对出现的,有开始就有结束。是大小写敏感的  

         <name><NAME>是不同的两个标签

      ***元素可以合理嵌套

         <person><name></name></person>

      ***元素不合理嵌套

         <person><name></person></name>

      ***元素不能以数字和下划线(_)开头去定义

         <2a></2a><_b></_b> 都是不合法的

      ***元素不能出现xmlXMLXml等开头

         <xml2></xml2><XMLR></XMLR><Xmlqw></Xmlqw>

         是不合法的

      ***元素不能出现空格、特殊字符(:、¥、$#)

          <a ge>20</a ge><a#ge>20</a#ge> 都是不合法的

      *** 以下定义是不同的含义,xml是会把空格、回车符一起解析的

    一:<person>张三</person>

 二:<person>

         张三

         <person>

  **属性的定义

     ***XMLHTML一样,标签中都可以定义属性

     ***XML可以定义多个不同名称的属性。

        例子:<person id="per1" name="name1">

      <person id="per1" id="name1">  属性名称相同,不合法

     ***属性的名称定义规则跟元素名称的一样

  **XML的注释

     ***<!--  -->

     ***<!-- <!-- --> --> 是不合法的,不允许嵌套注释

  **特殊字符

    类似于<>, &, ', "等都需要转译才能使用

 

  **CDATA

    <![CDATA[

      &$$$^&*$#@

    ]]>

    可以把要显示的内容放到CDATA区中,这些内容就可以正常显示

  **PI指令

    可以对xml设置样式

    <?xml-stylesheet type="text/css" href="css的路径"?>

注意:不能对中文的标签设置样式

4.XML约束

就是我们在描述事物时,一些本不属于该类事物的属性,单它又符合语法规则,对这类就必须加约束。

 XML约束:DTDSchema

 **DTD约束

       ***首先要创建dtd文件. (XX.dtd)xml中有多少个元素就要在dtd文件中写多少个 <!ELEMENT>

       ***简单元素: 没有子元素的元素

    <!ELEMENT 元素名称 (#PCDATA)>

             (1)#PCDATA: 表示内容的是字符串型

     (2)ANY: 表示内容是任意的,可以使字符串型,也可以为

              

     (3)EMPTY:表示元素内容是空的<age></age>

       ***复杂元素:有子元素的元素

    <!ELEMENT 元素名称 (子元素名称,子元素名称,...)>

       (1)"," 逗号表示子元素出现的顺序

     (2)"|" 表示子元素只能取其一  (枚举)

     (3)"+" 表示子元素有一次或者多次  >=1

     (4)"?" 表示子元素有零次或者一次  0,1

     (5)"*" 表示子元素有零次、一次或者多次  >=0

       ***然后就可以在xml文件中引入dtd约束

 

       ***DTD约束引入的方式

          ****外部引入DTD文件的方式

            <!DOCTYPE 根元素名称 SYSTEM "路径">

 

  ****内部嵌入DTD描述

    <!DOCTYPE person [dtd约束的代码]>

 

    例子:<!DOCTYPE person [

<!ELEMENT person (name,age)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT age (#PCDATA)>

     ]>

 

  ****网络中DTD约束文件

    例如 struts2的配置文件struts.xml:

    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">

 

DTD属性的定义

       语法: <!ATTLIST 元素的名称 属性名称 属性类型 属性的约束>

       *属性类型

    --CDATA:字符串

      <!ATTLIST birthday ID1 CDATA #REQUIRED>

 

    --枚举: 表示只能在一定范围内使用的值,但是每次只能使用其中的一个

   例子:(xx|yy|zz)

 <!ATTLIST age ID2 (xx|yy|zz) #REQUIRED>

 

    --ID: 表示只能字母或者下划线开头

 <!--ATTLIST name ID3 ID #REQUIRED>

       *属性约束  

    --#REQUIRED:属性必须存在

    --#IMPLIED: 属性可有可无

    --#FIXED:表示一个固定值 #FIXED "xx"

      属性值必须是设置的这个固定值

      <!ATTLIST sex ID4 CDATA #FIXED "xx"

    --直接值

***不写属性值, 使用直接值

***写了属性值,使用设置的值

<!--ATTLIST school ID5 CDATA "www">

DTD实体的定义

       语法:<!ENTITY 实体名称 "实体的值">

            例子:<!ENTITY TEST1 "hello">

     xml中引用实体是: &TEST1;

    例子:<name name1="sdfsd">&TEST1;</name>

注意:实体的定义应该定义在xml内部,使用内部引用。如果定义在dtd文档中,使用外部引用的方式,有可能得不到这个值,存在浏览器兼容的问题

Schema约束

    本身就是xml文档,文件后缀名XX.xsd

    它的根节点是:<schema></schema>

    例子:

    (1)创建一个schema文件(qw.xsd

  根节点:<schema xmlns="http://www.w3.org/2001/XMLSchema"  (表示当前xml文件是个约束文件)

targetNamespace="http://www.example.org/qw" (表示使用schema约束文件,直接通过这个地址引入约束文件)

xmlns:tns="http://www.example.org/qw" (表示默认的命名空间是:http://www.example.org/qw)

elementFormDefault="qualified">  (表示schema中声明过的元素必须被命名空间限定)      

   <element name="person">

  <complexType>

    <sequence>

     <element name="name" type="string"></element>

     <element name="age" type="int"></element>

    </sequence>

  </complexType>

   </element>  

   </schema>

         1.<element>是要看被约束xml文件中有多少个元素(标签),有多少个,这里相应的就应该有多少个<element>

   即这里对元素的约束是用<element>标签来表示的

 

         2.看被约束的xml文件中是复杂元素还是简单元素

      --复杂元素

       <element name="person">

  <complexType>

    <sequence>

         ...子元素

    </sequence>

  </complexType>

       </element>  

 

       --简单元素

        是定义在复杂元素里面的

                <element name="person">

<complexType>

 <sequence>

 <element name="name" type="string"></element> (简单元素)

  <element name="age" type="int"></element>  (简单元素)

</sequence>

</complexType>

 

</element>

         

             **<sequence>:表示子元素出现的顺序

     **<all>:表示子元素只能出现一次

     **<choice>:表示子元素只能选其一出现

 

     **maxOccurs属性:这个属性加在那个元素中,表示这个元素出现的最大次数(范围:1unbounded)。如果值是"unbounded"表示次数不限制

     **minOccurs属性:这个属性加在那个元素中,表示这个元素出现的最小次数(范围:01)

 

    (2)在被约束的xml文件中的根节点引入qw.xsd约束

       

        <person xmlns:tt="http://www.w3.org/2001/XMLSchema-instance"(表示这是一个被约束文档, 对应qw.xsd中的xmlns内容。但要加"-instance")

xmlns="http://www.example.org/qw"                       (对应qw.xsd中的targetNamespace里面的内容)

tt:schemaLocation="http://www.example.org/qw qw.xsd">(表示被约束文件是被哪个命名空间下的xsd文件约束。tt是别名)   

 <name>张三</name>

 <age>

</person

 

 

 

 



SAX方式

       ***SAXParser:解析类

       ***SAXParserFactory:解析工厂

       sax执行过程

        --创建SAXParser对象,通过SAXParser对象中的parse(String uri, DefaultHandler dh)方法执行解析

   uri:是xml的相对路径

      DefaultHandler:事件驱动器

--然后通过继承DefaultHandler覆写startElement()characters()endElement()方法

   当解析到开始标签的时候awefaewf,自动执行startElement()方法

      当解析到文本的时候,自动执行characters()方法

      当解析到结束标签的时候,自动执行endElement()方法

dom4j解析xml

   想要解析xml 首先需要解析器

sun公司提供了针对domsax解析器  jaxp

dom4j 针对domsax解析器 (实际开发中用的最多)

jdom,针对domsax解析器   jdom

使用dom4j解析xml

dom4j 是一个组织,针对xml解析,提供解析器dom4j

dom4j不是javase的一部分,所以要有这个第三方的包(dom4j.1.6.1.jar)

  **第一步得到document对象

SAXReader reader = new SAXReader();

Document document = reader.read(url);

  **第二步通过document对象的getRootElement()方法获取根节点

       Element e1 = (Element) document.getRootElement();

  **第三步通过Element对象的element(pname)elements(pname)elements()方法定位到某个标签

       a.element(qname):表示获取a标签中名称是qname的第一个标签,(qname是标签名称)

       a.elements(qname):表示获取a标签中所有名称是qname的同层标签

       a.elements():表示获取a标签中所有下一层标签(即只取a标签下面的一层)

 

 **增加一个标签

     addElement():添加标签 (在某标签里面最后追加)

     list.add(index,element);(在任意位置添加,通过elements获取到list)

  **创建一个标签

   Element element =  DocumentHelper.createElement(“标签名”)

  **删除一个标签

    fu.remove(zi)(通过父节点去删除子节点)

  **获取元素属性的值

attributeValue("属性")

  **增加属性和值

addAttribute(name,value);

  **增、删、改都需要回写xml

OutputFormat o_format = OutputFormat.createPrettyPrint(); //格式化XMLWriter x_writer = new XMLWriter(newFileOutputStream("src/two.xml"),format);

x_writer.write(document);

x_writer.close();  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值