xml基础知识总结和回顾

前几天在写js时,试图把XML DOM直接append到页面的元素中,试验和实践表明这是不行的,虽然xml dom和html dom都支持core dom的一些方法,都是文档树的节点,本质上比较相像,但是其实他们不能互相append到对方里面,需要解析出里面的内容,再做添加。

经过这个问题,发现XML基础有点淡忘了,故又重新复习了一下。

xml主要用来传输数据,而非显示数据,xml的标签都是自定义的,xml具有自我描述性,xml独立于软硬件平台
xml和html为不同的目的而设计

xml树结构
xml声明,xml根元素,xml元素(元素节点 属性节点 文本节点)
xml语法规则
xml标签都必须关闭
xml标签必须正确嵌套
xml标签区分大小写
xml文档必须有根元素
xml属性值必须有引号(单引号 或 双引号)

xml注释 和html注释方法一样 <!-- -->
xml元素的内容:要不包含其他元素,要不包含文本,要不同时包含元素和文本
xml元素的属性:在元素的开始标签中可以包含属性 类似 html,xml属性必须加引号(单引号或双引号皆可)类似 js,可用单引号或双引号括住字符串。我们可以根据需要把数据保存为元素的属性或元素的子元素
元数据(有关数据的数据)应该存储为属性,而不是子元素。


验证 XML 文档
一个合法的 XML 文档是"形式良好"的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>  
在上例中,DOCTYPE 声明是对外部 DTD 文件的引用


XML Schema
W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema:

<xs:element name="note">

<xs:complexType>
  <xs:sequence>
    <xs:element name="to"      type="xs:string"/>
    <xs:element name="from"    type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body"    type="xs:string"/>
  </xs:sequence>
</xs:complexType>

</xs:element>
如果您需要学习 XML Schema,

几乎所有的主流浏览器均支持 XML 和 XSLT。

XSLT 是首选的 XML 样式表语言。XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善

大多数浏览器都有读取和操作xml的xml解析器,解析器把xml转换为javascript可访问的对象

ie的xml解析器加载xml
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); //创建空的xml文档对象
xmlDoc.async="false";
xmlDoc.load("note.xml"); //加载xml文件
// xmlDoc.loadXML(xmlString); //加载xml格式的字符串

firefox和其他浏览器的xml解析器加载xml
var xmlDoc=document.implemetation.createDocument("","",null); //创建空的xml文档对象
xmlDoc.async="false"; //关闭异步加载
xmlDoc.load("note.xml"); //加载xml文件

加载xml格式的字符串 如下:
var parser=new DOMParser(); //创建dom解析器
var doc=parser.parseFromString(txt,"text/xml"); //解析xml格式的字符串

* ie使用loadXML方法来解析xml字符串,其他浏览器使用DOMParser对象


跨域访问
出于安全方面的原因,现代的浏览器不允许跨域的访问。

这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。
//解析xml文件的跨浏览器实现
function parseXML(xmlFile){
 try{ //ie
    var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    }
 catch(e){ //firefox,safari,opera
    try{
        var xmlDoc=document.implementation.createDocument("","",null);
    }
    catch(e){
        alert(e.message);
        return;
    }
 }
 xmlDoc.async=false;
 xmlDoc.load(xmlFile);
}
//解析xml字符串的跨浏览器实现
function parseXMLString(xmlStr){
    try{ //ie
        var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.loadXML(xmlStr);
    }
    catch(e){
        try{ //firefox,opera,chrome
            var parser=new DOMParser();
            var xmlDoc=parser.parseFromString(xmlStr,"text/xml");
        }
        catch(e){
            alert(e.message);
            return;
        }
    }
}


XMLHttpRequest 对象提供了在网页加载后与服务器进行通信的方法。
XMLHttpRequest 对象是开发者的梦想,因为您能够:

在不重新加载页面的情况下更新网页
在页面已加载后从服务器请求数据
在页面已加载后从服务器接收数据
在后台向服务器发送数据
所有现代的浏览器都支持 XMLHttpRequest 对象。

XMLHttpRequest对象是ajax的核心

XMLHttpRequest对象的创建:
所有现代浏览器 包括ie7 (new 一下即可)
xmlhttp=new XMLHttpRequest();

ie5/6中需要通过ActiveXObject创建
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

使用命名空间(Namespaces)
这个 XML 文档携带着某个表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>此 XML 文档携带着有关一件家具的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
XML Namespace (xmlns) 属性
XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。


所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

转义字符
非法的 XML 字符必须被替换为实体引用(entity reference)。

假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:

<message>if salary < 1000 then</message>为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:

<message>if salary &lt; 1000 then</message>

CDATA 内部的所有东西都会被解析器忽略。CDATA 区段开始于 "<![CDATA[  ....  ]]>":
关于 CDATA 区段的注释:

CDATA 区段不能包含字符串 "]]>",所以,CDATA 区段的嵌套是不被允许的。

同时也需要确保在 "]]>" 字符串中没有空格或折行。

xml编码

结论
结论是:编码属性应当被指定为文档被保存时所使用的编码。我最好的避免错误的建议是:

使用支持编码的编辑器
确定编辑器使用的编码
在您的 XML 文档中使用相同的编码属性



posted @ 2013-05-21 14:06  stephenykk  阅读(253)  评论(0编辑  收藏  举报