欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML 学习整理

程序员文章站 2022-03-30 13:14:49
...

xml简介

  学习xml首先需要明白xml和html的区别:
   - xml指可扩展标记语言(eXtensible Markup Language)。被设计用来传输和存储数据。
  - HTML指超文本标记语言(HyperText Markup Language)。是一种用于创建网页的标准标记语言。主要是用来展示页面。
  - 最明显的区别是XML标签没有被预定义。您需要自行定义标签。
  - XML 被设计为具有自我描述性。例如:

        <?xml version="1.0" encoding="UTF-8"?>
        <note>
            <to>Tove</to>
            <from>Jani</from>
            <heading>Reminder</heading>
            <body>Don't forget me this weekend!</body>
        </note>

  上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。
  上面实例中的标签没有在任何 XML 标准中定义过(比如 to 和 from)。这些标签是由 XML 文档的创作者发明的。这是因为 XML 语言没有预定义的标签。
HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 p、h1 等等)。
  XML 允许创作者定义自己的标签和自己的文档结构。

xml文件主要用途

  xml文件可以实现数据文本化。将底层数据独立的存储在xml文档中,简单的HTML页面可以通过JavaScript来读取,然后去渲染页面,减少底层的重复工作。更重要的是将数据存放在文档格式的xml文件中会方便不同程序不同机器之间的调用,这不论是对于应用系统自身的升级和变更还是对于不同应用程序之间的交流都具有不一般的意义。

xml文件的编写要求

  xml文件整体上是一个树形结构,如上文便签的例子,第一行是 XML 声明(它定义 XML 的版本(1.0)和所使用的编码。xml声明并不是必须写的,但是如果要写的话必须放在第一行,而且前面不能有空格和其他内容。版本号以后可能会有其他数字,但就目前而言是1.0。编码格式不区分大小写。HTML的声明最好写上,它决定了浏览器对其页面的渲染方式,如果没有声明,将默认使用统一之前的怪异渲染模式去渲染,到时候页面可能达不到预期的效果)。XML 文档必须包含根元素。该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。所有的元素都可以有子元素。
  xml在编写上与HTML有两点区别很大:
  - 首先在HTML中一些标签并不需要闭合,但是在xml中省略关闭标签是违法的,所有元素都必须有关闭标签;
  - 在者HTML中标签是不区分大小写的,但是在xml中是严格区分大小写的;
  -XML 以 LF 存储换行;
  -HTML 会把多个连续的空格字符裁减(合并)为一个,但是在 XML 中,文档中的空格不会被删减。
  xml必须正确嵌套,在哪个元素内开始就必须在哪个元素内关闭。
  xml标签可以有自己的自定义属性,需要注意的是属性的值必须带引号。
  xml文件中某些拥有特殊意义的字最好使用实体引用来代替。例如 < ,如果您把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。为了避免这个错误,请用实体引用 “& lt;”来代替 “<” 字符。在 XML 中,有 5 个预定义的实体引用:

实体 引用
&lt; <
&gt; >
&amp; &
&apos; '
&quot; "

在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

xml元素的相关规范

  xml元素是指指的是从(且包括)开始标签直到(且包括)结束标签的部分。
一个元素可以包含:其他元素、文本、属性、或混合以上所有。
  xml命名规则:

  • 名称可以包含字母、数字以及其他的字符;
  • 名称不能以数字或者标点符号开始;
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始;
  • 名称不能包含空格。
      使名称具有描述性。使用下划线的名称也很不错。XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名 XML 文档中的元素。
      在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。这里就需要借助命名空间来解决。在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。例如 < h:table>
      当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。命名空间是在元素的开始标签的 xmlns 属性中定义的。命名空间声明的语法如下。xmlns:前缀=”URI”。如:
<root>

<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>

<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root>

在上面的实例中,< table> 标签的 xmlns 属性定义了 h: 和 f: 前缀的合格命名空间。
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明。

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">

<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root>

* 命名空间 URI 不会被解析器用于查找信息。
其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。它的语法如下:

<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>

  对于属性没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用元素。我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧。

xml的解析

所有现代浏览器都有内建的 XML 解析器。
XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。
下面的代码片段把 XML 文档解析到 XML DOM 对象中:

if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","books.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;

下面的代码片段把 XML 字符串解析到 XML DOM 对象中:

txt="<bookstore><book>";
txt=txt+"<title>Everyday Italian</title>";
txt=txt+"<author>Giada De Laurentiis</author>";
txt=txt+"<year>2005</year>";
txt=txt+"</book></bookstore>";

if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(txt); 
}

出于安全方面的原因,现代的浏览器不允许跨域的访问。
这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。
下面的实例把 XML 文档(”note.xml”)解析到 XML DOM 对象中,然后通过 JavaScript 提取一些信息:

<html>
<body>
<h1>W3Schools Internal Note</h1>
<div>
<b>To:</b> <span id="to"></span><br />
<b>From:</b> <span id="from"></span><br />
<b>Message:</b> <span id="message"></span>
</div>

<script>
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","note.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;

document.getElementById("to").innerHTML=
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
document.getElementById("from").innerHTML=
xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
document.getElementById("message").innerHTML=
xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
</script>

</body>
</html>

XML CDATA

XML 文档中的所有文本均会被解析器解析。只有 CDATA 区段中的文本会被解析器忽略。某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 “< ![CDATA[” 开始,由 “]]>” 结束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>

更多的对于xml节点的增删改查可以通过查询w3c school

本文参考网站http://www.runoob.com