XML的一点复习和理解

来源:互联网 发布:软件使用许可费 编辑:程序博客网 时间:2024/05/17 01:38

XML的描述

  • 可扩展的标记语言,主要用于传输数据。(html是超文本标记语言,即可以包括图片,video等资源,主要用于显示数据)。
  • 版本有XML1.0和XML1.1(不向下兼容),主要还是用XML1.0.
  • 作用:可以用于配置文件和可以在系统与系统之间传输数据。
  • 里面的所有空格换行都会被当做内容原样读出。

简单语法

  • 文档声明
<?xml version="1.0" encoding="utf-8" standalone="yes|no"?>`
 version版本是必须的,encoding是编码的方式,standalone文件是否独立,即是否需要引入外部的文件,yes是独立的不需要引入外部的文件,no不是独立的,需要引入外部的文件。  文件的乱码说明:保存文件的编码方式是由你选择的编码方式确定,浏览器打开文件的编码方式由encoding的值确定,如果两者不一 ,就会出现乱码,解决的办法就是让保存和打开的编码方式一致。
  • 元素
    1. 有开始标签和结束标签,
    2. 闭合标签,不能嵌套,有且仅有一个根节。
    3. 元素都是自定义的,即不能以数字和-打开,区分大小写,不能出现空格和冒号,不能以XML,xml,Xml等开头。
   <root><user>cfq</user><password>123456</password></root> 
  • 属性
    都是自定义属性,一个元素上不能有相同的属性,必须用单引号或者双引号引起来(html都就没有这么严格,不引也没有错)。
    <root>    <user "hobby"="running" "email"="123456@qq.com">cfq</user>    <password "length"="6">123456</password>    </root> 
  • CDATA区
    特殊字符,把标签中的内容当作字符串。
    产生的原因: 在xml中有些特殊的字符必须专一才能读出来,如果这样的特殊字符太多了,一个一个转义实在是不方便,但是如果使用CDATA这可以直接将整体当作字符串处理。
    特殊字符:
    1.< &lt ; 2. > &gt ; 3.& &amp ; 4.” &quot ; 5.’ &apos ;
    2<书><![CDATA[
    if(1<6){> <};
    ]]></书>
    里面的if语句就会被当作字符串,不用再依次对里面的特殊字符进行转义。
  • XML约束
    xml太强大,必须用约束来限制它,有效的xml:有约束的xml文件 。格式良好的xml:遵循语法规范的。
    1.DTD(Document type defined),文档类型声明
    - dtd与xml文件的关联方式
     1.在xml文件中直接引入外部的dtd文件(文件名.dtd),    <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
     2.xml文件内部直接书写dtd文件     <!DOCTYPE 根节点[dtd代码]>
    3.xml文件中引入网络上的dtd文件    <!DOCTYPE 根节点 PUBLIC "dtd文件的名称" "dtd文件的地址">
  • 实体的定义
<! ENTITY 属性(值) "值"><!ENTITY username "张三"> 主要用在文本中,在文本中的引用使用&属性;来使用其值: <作者>&username;</作者>
  • DTD的入门
    元素的定义:
 <!ELEMENT 元素名称 元素类型>

元素名称 :及定义的元素名称;
元素类型:

  • (#PCDATA)字符串<user>cfq</user>
  • EMPTY 空,元素的值为空,`
  • ANY 任意值 <user></user> <pass>123</pass>
  • (子元素)
    子元素之间的关系有:(子元素1,子元素2,子元素3),子元素的出现必须是按着1,2,3的顺序出现,有顺序。(子元素1|子元素2),子元素中子元素1和子元素2两者只能出现其中的一个.子元素出现的个数(子元素+,子元素*,子元素?),+表示出现的次数 >=1,?表示<=1; * 表示>=0;
    `

属性的定义

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

属性类型

  • CDATA :字符串
  • 枚举:没有提供关键字 例如 左|右 出现列举出来的值
  • ID 代表唯一的值
    属性约束:
    • #REQUIRED 属性必须输出
    • #IMPLIED 可选的,可以出现,也可以不出现。
    • #FIXED 规定值 FIXED “张三”

XML 不能被浏览器解析,HTML可以被浏览器直接解析
xml的解析有很多方式,常用的方式有两种:DOM和SAX。

  1. DOM方式的解析,会在内存中形成相应的DOM树,方便做增删改查,但会导致文件过大,容易产生内存溢出的现象。
  2. SAX是基于事件驱动的方式,边解析边读取,不会产生内存溢出的操作,但不能实现增删改查操作。

公司产生的解析包(包里面包含了对XML的两种解析方式):
JAXP:sun公司生产的,dom和sax方式,没有多大的改进,增删改查只能用dom方式,
DOM4J是整合了两者的优点,推荐使用,

java 解析XML文件

一、JAXP(java api for xml processing)方式的
- 获取解析器工厂类DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- 获取解析器对象DocumentBuilder builder=factory.newDocumentBuilder();
- 获取xml文档,返回document对象Document document=builder.parse("src/book2.xml");“src/book2.xml”我们要解析的xml文档位置
- 进行相应的dom操作,改变的是内存中的DOM树
- 如果要改变原文档的内容,必须回写,
- 获取回写类的工厂类TransformerFactory transformerFactory=TransformerFactory.newInstance();
7.获取回写的对象Transformer transformer=transformerFactory.newTransformer();
8调用回写对象的方法进行回写 transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));document我们操作过的内存dom.”src/book2.xml”要回写到的文件

Javascript

IE中

IE是第一个原生支持XML的浏览器,为了便于处理,微软创建了MSXML库,方便操作xml
- IE创建document文档

function createXMLObject(){    var version=[        'MSXML2.DOMDocument6.0',/*不同的库版本*/        'MSXML2.DOMDocument3.0',        'MSXML2.DOMDocument'    ];        for(var i=0;i<version.length;i++){              try{                var xmlDom=new ActiveXObject(version[i]);//创建一个xml文档                 return xmlDom;              }catch(e){              }            }            throw new Error("你的系统不支持XML");}

创建的文档是一个空文档,我们必须向其中添加内容,
var xmlDom=createXMLObject();//是一个documentXML,可以对其进行相应的操作
xmlDom.loadXML(“添加的字符串标签”);xmlDom.loadXML("<root>\n<user>LEEE</user>\n</root>");
如果解析过程出现了错误,可以在parseError属性中找到错误。

if(xmlDom.parseError!=0){   //有错误发生   alert("发生错误的行数"+xmlDom.parseError.line+"多错误文本的解释"xmlDom.parseError.reason);}

xmlDom.xml序列化属性,其中保存着表示该节点的xml字符串.
IE中的加载外部xml的方式,可以使用xmlDom.load(“加载的xml文件的url”);

  • 同步方式加载:xmlDom.async=”fasle”;,文件下载方式过长,会导致反应很慢,
  • 异步加载方式:xmlDom.async=”true”;默认是异步方式,会导致还没有加载完全就执行下面的代码,使出现空,所以出现了下面的判断。
 //必须卸载加载文件之前,准备的处理函数,在onreadystatechange中的所有对象都不能使用this来指代,因为这个函数比较特殊,里面的this都指向window,而不是执行的Object  xmlDom.onreadystatechange=function(){      if(xmlDom.readyState==1){        alert("正在加载xml文件");      }else if(xmlDom.readyState==2){      alert("加载xml文件完成");      }else if(xmlDom.readyState==3){       alert("加载xml文件完成,部分可以使用");      }else{         alert("加载xml文件完成,全部可以使用");      }  }

w3c中

DOM2级 不支持loadXML()方法,无法简易的字符串创建文档,有load()方法可以载入同一个服务器的,没有xml属性的序列化方法.onload()事件相当于IE中的就绪状态事件,由于w3c中的load()方法只支持Firefox和最新的Opera版本,因此就无法实现兼容,

  • 创建文档
 var xmlDom=document.implementation.createDocument(' ','root',null);//没有默认的命名空间和文档类型

第一个’ ‘表示的是命名空间,在js中命名空间很难管理,比价少使用,null表示的是文档声明,root表示的是创建的根节点.

  • 添加内容,模仿loadXML()
    可以直接在得到的文档里面进行相应的dom操作来添加元素,比较麻烦。没有loadXML()方法,可以方便直接创建元素。因此引入了DOMParser来模拟loadaXML()方法,方便来解析xml
var xmlParser=new DOMParser();//只能解析格式良好的xmlvar xmlStr="<root><user>LFC</user></root>";//要解析成xml的字符串var xmlDom=xmlParser.parseFromString(xmlStr,'text/xml');//返回的是一个Document的实例,如果解析错误也会放回一个document对象,这个对象的文档元素是<parsererror>,而文档内容是对解析错误的描述
  • 序列化,模仿xml
var serializer=new XMLSerializer();var xml=serializer.serializeToString(xmlDom);//xmlDom是我们要序列化的xml文档,可以序列化任何有效的dom对象,包括html文档,将被当作xml文档序列化.
0 0
原创粉丝点击