javaWeb学习之——XML

                                             javaWeb学习之——XML

     学习了java有一段时间了,学的时候觉得弄懂就可以,没每天去总结和写日志。现在感觉以前的想法是错的,现在我要每天都写
日记,把每天的东西总结记下来,以便以后复习,第一次写日志,感觉好烂,表达得也不清楚,今后要更加努力才行。      真蛋疼,刚开通还不能写博客   

XML简介
XML是指可扩展的标记语言(eXtensible Markup Language)是一种可自定义的语言,是为传输数据而设计,而不是
显示数据,W3C组织发布的东西,XML出现的根本目的是描述
数据的关系,

XMl中的数据必须通过程序来解析或显示,

在Java开发中,传统的配置文件是*。properties(key=value)的方式,而XML表示的数据更为丰富,

XML技术除了用于描述以外,还可以用于程序的配置信息

在编写XML文档时,而要先使用文档声明XML文档。且必须出现在文档的第一行,

最简单的语法:<?xml varsion="1.0"?>

XML元素指XML文件中出现的标签。一个标签分为天起始标签和结束标签,不能省略,

一个XML只能有一个根标签,基他标签都是它的子标签,或孙标签。

XML的标签注释不能嵌套<!--内容-->

CDATA
CDATA区是sharacter Data的缩写
作用:把标签当做普通文本内容//<![CDATA[内容]]>

<![CDATA[

  <itcast>www.itcast.cn</itcast>

]]>

XML约束之DTD
XML都是用户自定义的标签,若出现点小错误,软件程序将不能正确的获取内容而报错。
这时我们可能编写一个文档来约束一个XML的书写规范,这个文档称之为约束。

总之 约束文档定义在XML中允许出现的元素名称,属性及出现的顺序,

常用的约束技术,XML DTD                  XDR  SOX  XML Sche。

DTD快速入门
book.dtd
 
<!ELEMENT 书架(书+)>//书架的根结点,书架里有一本或多本书。
<!ELEMENT 书(书名,作者,售价)>//书里面有书名,作者,售价。要按顺序写
<!ELEMENT 书名(#PCDATA)>//#PCDATA可以放文本内容

<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售价(#PCDATA)>
lIE5以上浏览器内置了XML解析工具:Microsort.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对

xml文件进行dtd验证。
l创建xml文档解析器对象

l var xmldoc = new ActiveXObject (" Microsoft.XMLDOM ");

l开启xml校验 l xmldoc.validateOnParse = "true";

l装载xml文档

lxmldoc.load("book.xml");

l获取错误信息

l xmldoc.parseError.reason

lxmldoc.parseError.line

XML使用DOCTYPE声明语句来指明它所遵循的DTD文档有两种
当DTD文件本地时,采用以下方式
<!DOCTYPE 根元素SYSTEM "DTD文档路径">
如<!DOCTYPE 书架SYSTEM "book.dtd">

当采用的DTD文档在网络上时,用以一方式
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

定义元素
定义属性
定义实体

使用规则

#PCDATA 指定元素只能是普通文本

EMPTY 指定元素文体为空 如<br/>

ANY: 用于指定元素是任意类型
(子元素)用来指示元素中包含的子元素

定义子元素及描述它们的关系
   如果子元素用逗号分开,说明是有序的,只能指声明的顺序去写;
   如<!ELEMENT 书(one,two)>
  
如果用的是|分开那就可以在里面任选一个。
<!ELEMENT 书(one|two)>

用+,*,?来表示元素出现次数
   +一次或多次,至少一次
   *   零次或多次
   ?  一次或零次

DTD--定义属性1

语法:
     <!ATTLIST  元素名
         属性名1 属性值类型 设置说明 
             属性名1 属性值类型 设置说明
          属性名1 属性值类型 设置说明
  

     属性值类型:
    CDATA:表示属性值为普通文本
    ENUMERATED 表示枚举,只能从列表中取一个值
   ID 表示属性的取值不能重复
 
设置说明
  #REQUIED 表示该属性必须出现,
  #IMPLIED  表示该属性可在可无
  #FIXED  表示的取值为一个固定的
  直接值:表示默认的。

如:<!ATTLIST 作者
        姓名 CDATA #IMPLIED
            年龄 CDATA #IMPLIED
          电话 CDATA #REQUIRED
           CDATA "上网">


Java解析XML概述
  XML的解析方式分为两种,DOM方式和SAX方式
     DOM:Document Object Model,文档对象模型,是W3C推荐的一种方式。

     SAX:Simple API for XML 这种不是官方标准的,属于开源社区XML-DEV,几乎所有XML解析器都支持它。

XML解析开发包
   JAXP:是SUN推出的标准实现,
   DOM4J:是开源组织推出的解析包。(一般都用它)
   JDom:是开源组织推出的解析开包;

JAXP
JAXP:(Java API for XML Processing)开发包是JavaSe的一部分,安由以下几个子包组成:
    org.w3c.dom:提供DOM方式 解析的XML标准接口。
    org.xml.sax:提供SAX方式解析XML的标准接口。
    javax.xml:提供了解析文档的类。
javax.xml.parsers包中,定义了几个工厂类。我们可以通过调用这些工厂类来得到对XML文档解析的DOM和SAX解析器对象。

DocumentBuilderFactory 
SAXParserFactory

xml.parsers包吕的DocumentBuilderFactory用于创建DOM模式的解析对象,DocumentBuilderFactory是一个抽象工厂,它不能直接实例化,但是提供了一个newInstance的静态方法。
DOM解析器对象的parser()方法解析XML文档,得到代表整个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作。

DOM编程
   DOM解析XML文档时,会把文档中所有的元素,按照其出现的层次关系,解析成一个个Node对象,(节点);
   在DOM中,节点的关系如下:
     位于一个节点之上的节点是该节点的父点(parent)
      一个节点之下的节点是该节点的子节点(children)
     同一个层次,具有相同父节点的节点是兄弟节点,(sibling)
     一个节点的下一个层次的节点集合是该节点的后代(descendant)

Node对象
   Node对象提供了一系列代表节点的类型,当开发人员 得到某个Node类型后,就可以把Node节点转换成相应的节点(Node的子类对象)

Node对象提供了相应的方法获得这的父节点或子节点。开发人员通过这些方法就可读取整个XML的文档内容,CDQU

DOM方式解析XML文件
   1 得到某个具体的节点内容
   2 遍历所有元素节点
   3 修改某个元素的节点内容
   4 向指定节点中增加子元素
   5 向指定元素节点上增加同级元素节点
   6 删除指定元素节点JaxpDemoCRUD.java
   7 操作XML文件属性


SAX解析
在使用DOM解析文档时,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作,
此种情况下,如果XML文档特别大,就会消耗计算机大量内存,并且容易导致内存溢出。

SAX解析允许在读取文档和时候,即对文档进行处理,而不必等到整个文档装载完才会对文档进行操作

SAX采用事件处理方式解析XML文档,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器:
   
   解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
   
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的XML文件内容作为方法的参数传递给事件处理器。

  事件处理器由程序员编写,程序员通过事件处理器中和方法的参数,就可以很轻松的得到SAX解析器解析到和数据,从而可以决定如何对数据进行处理。



SAX方式解析XML文档

 1使用SAXParserFactory创建SAX解析工厂
   SAXParserFactory sp=SAXParserFactory.newInstance()
 
 2 通过SAX解析工厂得到解析器对象,
    SAXParser parser=sp.newSAXParser();

 3 通过解析器对象得到一个XML的读取器。
     XMLReader reader=parser.getXMLReadre();

 4 设置读取器的事件处理器,
    reader.setContentHandler(new BookParserHandler());

 5 解析XML文件
   reader.parser("book.xml");


DOM4J解析XML文档
   Dom4j是一个简单,灵活的开源代码库,Dom4j是邮早期开发 JDOM的人分离出来后独立开发的,
    与JDOM不同的是Dom4J使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

Dom4j是一个非常优秀的java XML API ,具有性能优异,功能强大和易使用的特点,现在很多软件采用的Dom4j,例如Hibernate,包括SUN公司自己的JAXM也用了Dom4j。

使用Dom4j开发需要下载Dom4j相应是jar文件。


Document对象

  dom4j中获得Document对象的方式有三种
  1,读取XML文件获得Document对象
    SAXReader reader=new SAXReader();
     Document document=reader read(new File("input.xml"));

2解析XML形式的文本得到document对象
   String text="<mwmbers></members>";
    Document document=DocumentHelper.parseText(text);

3主动创建document对象
  Document document=DocumentHelper.reateDocument();//创建根节点 
   Element root=Document.addElement("members");

节点对象

1,取得文档的根节点。
  Element root=document.getRootElement();

2 取得某个节点的子节点,
  Element element=node.element("书名");

 3 取得节点的文字,
 String text=node.getText();

4取得某节点下所有名为member的节点,并遍历
  List nodes=rootElem.elements("member");
   for(Iterator it=nodes.iterator();it.hasNext();
    {  Element elem=(Element)it.next();
       }

5.对某个节点下的所有子节点进行遍历
  for(Iterator it=root.elementIerator();it.hasNext();){
  Element elm=(Elemnet)it.next();
}

6在某个节点下添加子节点。
 Element ageElm=new MemberElm.addElement("age");

7.设置节点文字
 element.setText("29");

8.删除某个节点
 parentElm.remove(childElm);

9添加一个CDATE节点
 Element contentElm=infoElm.addElement("content");
 contentElm.addCDATA(diary.geContent());

节点对象属性

1.取得某节点下的某属性
  Element root=document.getRootElement();
  Attribute attribute =root.attribute("size");

2取得属性的文字
 String text=attribute.getText();

3删除某个属性
 Attribute attribute=root.attribute("size");
 root.remove(attribute)

4遍历某节点的所有属性,
 Element root=document.getRootElement();
 for(Iterator it=root.attributeIterator();it.hasNext(){
 Attribute attribute=(Attribute)it.next();
  String text=attribute.getText();
System.out.println(text);
}

5设置某节点的属性和文字
  newMemberElm.addAttribute("name","settString");

6设置属性的文字。
Attribute attribute=root.attribute("name");
attribute.setText("settString");

将文档写入XML文件
 1 文档中全为英文时,不用设置编码,直接写入的形式
  XMLWriter write=new XMLWriter(new File("output.xml"));
write.write(document);
write.close();

2文档中含有中文的,设置编码格式写入的形式;
 OutputFormat format=OutputFormat.createPrettprint();
 format.setEncoding("utf-8");
 XMLWriter writer=new XMLWriter(new FileOutputStream("output.xml"),format);
writer.write(document);
writer.close();

Dom4j在指定位置插入节点 
1得到插入位置的节点列表(List)
2 调用List.add(index,element),由index决定插入的位置;
3 Element元素可以通过DocumentHelper对象得到
  Element aaa=DocumentHelper.createElement("aaa");
  aaa.setText("aaa");
   List list=root.element("书").elements();
   list.add(1,aaa);
    保存document

字符串与XML的转换
1 将字符串转化为XML

  String text="<members><member></member></members>";
  Document DocumentHelper.parseText(text);

2将文档或节点的XML转化为字符串;
  SAXReader read=new SAXReader();
 Document document=reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.elemenet("member");




XMLSchema

XML Schema 也是一种用于定义和描述XML文档结构与内容的模式,其出现是为了克服DTD的局限性。
 
XML Schema VS DTD
   XML Schema符合XML语法结构。
   DOM,SAX等XMLAPI很容易解析出XMLSchema文档中的内容
   XML Schema对名称空间支持得非常好,
   XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语法限制
   XMLSchema 不能像DTD一样定义实体,比DTD更复杂,但XML Schema已是W3C组织的标准,它逐步取代DTD


XMLSchema文件自身就是一个XML文件,但它是扩展名为.xed

一个XML Schema 文档通常称为模式文档(约束文档),遵循这个文档书写的XML文件称为实例文档。

和XML文件一们,一个XML Schema文档也必须有一个根结点。得这个根结点的名称为schema 。

编写了一个XML Schema 约束后,通常需要把这个文件中声明的元素绑定到一个URL地址上,
在XML Schema 技术中有一个专业术语来描述这个过程,即把XML Schema 文档声明的元素绑定到一个名称空间上,
以后就可以通过这个URL来告诉解析器引擎,XML 文档中编写的元素来自那里,被谁约束。


<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema” //标准的名称空间
targetNamespace=“http://www. itcast.cn” //将该schema文档绑定到http://www.itcast.cn名称空间
elementFormDefault="qualified">
<xs:element name='书架' >
 <xs:complexType>
   <xs:sequence maxOccurs='unbounded' >
      <xs:element name='书' >
	<xs:complexType>
	  <xs:sequence>
	    <xs:element name='书名' type='xs:string' />
	    <xs:element name='作者' type='xs:string' />
	    <xs:element name='售价' type='xs:string' />
	 </xs:sequence>
	</xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值