XML 高级.docx
- 文档编号:30348918
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:31
- 大小:27.73KB
XML 高级.docx
《XML 高级.docx》由会员分享,可在线阅读,更多相关《XML 高级.docx(31页珍藏版)》请在冰豆网上搜索。
XML高级
XML命名空间(XMLNamespaces)
∙PreviousPage
∙NextPage
XML命名空间可提供避免元素命名冲突的方法。
命名冲突
在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
这个XML文档携带着某个表格中的信息:
Apples | Bananas |
这个XML文档携带有关桌子的信息(一件家具):
假如这两个XML文档被一起使用,由于两个文档都包含带有不同内容和定义的
Apples | Bananas |
此XML文档携带着有关一件家具的信息:
命名空间的实际应用
当开始使用XSL时,您不久就会看到实际使用中的命名空间。
XSL样式表用于将XML文档转换为其他格式,比如HTML。
如果您仔细观察下面的这个XSL文档,就会看到大多数的标签是HTML标签。
非HTML的标签都有前缀xsl,并由此命名空间标示:
"http:
//www.w3.org/1999/XSL/Transform":
xmlversion="1.0"encoding="ISO-8859-1"?
>
stylesheetversion="1.0"xmlns: xsl="http: //www.w3.org/1999/XSL/Transform"> templatematch="/">MyCDCollection
for-eachselect="catalog/cd"> value-ofselect="title"/> value-ofselect="artist"/>
for-each>
template>
stylesheet>
XMLCDATA
∙PreviousPage
∙NextPage
所有XML文档中的文本均会被解析器解析。
只有CDATA区段(CDATAsection)中的文本会被解析器忽略。
ParsedData
XML解析器通常会解析XML文档中所有的文本。
当某个XML元素被解析时,其标签之间的文本也会被解析:
解析器之所以这么做是因为XML元素可包含其他元素,就像这个例子中,其中的
而解析器会把它分解为像这样的子元素:
转义字符
非法的XML字符必须被替换为实体引用(entityreference)。
假如您在XML文档中放置了一个类似"<"字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。
因此你不能这样写:
为了避免此类错误,需要把字符"<"替换为实体引用,就像这样:
在XML中有5个预定义的实体引用:
<
<
小于
>
>
大于
&
&
和号
'
'
省略号
"
"
引号
注释:
严格地讲,在XML中仅有字符"<"和"&"是非法的。
省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
CDATA
CDATA内部的所有东西都会被解析器忽略。
假如文本中包含了大量的"<"和"&"字符-就像编程代码中经常出现的情况一样-那么这个XML元素就可以被定义为一个CDATA部分。
CDATA区段开始于"
[CDATA[",结束于"]]>":
[CDATA[
functionmatchwo(a,b)
{
if(a
{
return1
}
else
{
return0
}
}
]]>
在上面的例子中,在CDATA区段中的所有东西都会被解析器忽略。
关于CDATA区段的注释:
CDATA区段不能包含字符串"]]>",所以,CDATA区段的嵌套是不被允许的。
同时也需要确保在"]]>"字符串中没有空格或折行。
XML编码
∙PreviousPage
∙NextPage
XML文档可能包含外国字符,比如挪威语,或者法语。
为了让XML解析器读懂这些字符,您需要把XML文档存为Unicode。
Windows2000记事本
Windows2000记事本可以把文件保存为Unicode。
将XML文件保存为Unicode(注意,此文档未包含任何编码属性):
xmlversion="1.0"?
>
êèé
上面的文件,note_encode_none_u.xml,在IE5+、Firefox或者Opera中不会出错,但是在Netscape6.2中会出错。
Windows2000NotepadwithEncoding
Windows2000记事本使用"UTF-16"编码将文件保存为Unicode。
如果您为保存为Unicode的XML文件添加了一个编码属性,windows的编码值可能产生错误。
下面的编码(打开它),不会报错:
xmlversion="1.0"encoding="windows-1252"?
>
下面的编码(打开它),不会报错:
xmlversion="1.0"encoding="ISO-8859-1"?
>
下面的编码(打开它),不会报错:
xmlversion="1.0"encoding="UTF-8"?
>
下面的编码(打开它),在IE5+、Firefox或者Opera重不会发出错误信息,但是在Netscape6.2中会报错。
xmlversion="1.0"encoding="UTF-16"?
>
错误消息
如果您试图向IE中载入XML文档,可能会得到两种指示编码问题的错误:
在文本内容中发现非法字符
如果XML文档中的某个字符与编码属性不匹配,您就会得到这个错误消息。
通常,当XML文件中含有外国字符,且当文件使用类似记事本的单字节编码编辑器保存,以及没有指定编码属性时,您就会得到这个错误消息。
将当前编码切换为不被支持的指定编码
如果您的文件被保存为Unicode/UTF-16,但是编码属性被指定为单字节编码(比如Windows-1252、ISO-8859-1或者UTF-8)时,那么您就会得到这个错误消息。
或者当您的文档被保存为单字节编码,但编码属性被指定为双字节编码(比如UTF-16)时,也会得到这个错误消息。
结论
结论是:
编码属性应当被指定为文档被保存时所使用的编码。
我最好的避免错误的建议是:
∙使用支持编码的编辑器
∙确定编辑器使用的编码
∙在您的XML文档中使用相同的编码属性
服务器上的XML
∙PreviousPage
∙NextPage
XML可以在不安装任何XML控件的情况下在服务器端生成。
在服务器上存储XML
XML文件可被存储在服务器上,和HTML文件的存储方式是完全相同的。
启动Windows记事本,并编写以下代码行:
xmlversion="1.0"encoding="ISO-8859-1"?
>
然后把这个文件命名为"note.xml"并保存在您的服务器。
通过ASP生成XML
XML可在不安装任何XML软件的情况下在服务器端生成。
如需从服务器生成XML响应-只需简单地编写以下代码并在服务器上把它保存为一个ASP文件:
<%
response.ContentType="text/xml"
response.Write("
xmlversion='1.0'encoding='ISO-8859-1'?
>")
response.Write("
response.Write("
response.Write("
response.Write("
")
response.Write("")
%>
请注意,此响应的内容类型必须设置为"text/xml"。
查看这个ASP文件如何从服务器返回。
如果您还不懂如何编写ASP,请访问我们的《ASP教程》。
从数据库获取XML
XML可在不安装任何XML软件的情况下从数据库生成。
如需从服务器生成XML数据库响应,只需简单地编写以下代码,并把它在服务器上保存为ASP文件:
<%
response.ContentType="text/xml"
setconn=Server.CreateObject("ADODB.Connection")
conn.provider="Microsoft.Jet.OLEDB.4.0;"
conn.openserver.mappath("/db/database.mdb")
sql="selectfname,lnamefromtblGuestBook"
setrs=Conn.Execute(sql)
rs.MoveFirst()
response.write("
xmlversion='1.0'encoding='ISO-8859-1'?
>")
response.write("
while(notrs.EOF)
response.write("
response.write("
response.write("
response.write("")
rs.MoveNext()
wend
rs.close()
conn.close()
response.write("")
%>
上面的例子使用了带有ADO的ASP。
如果您不懂如何使用ADO,请访问我们的《ADO教程》。
XMLDOM高级
∙PreviousPage
∙NextPage
XMLDOM(DocumentObjectModel)定义了访问和操作XML文档的标准方法。
XMLDOM
DOM把XML文档视为一种树结构。
通过这个DOM树,可以访问所有的元素。
可以修改它们的内容(文本以及属性),而且可以创建新的元素。
元素,以及它们的文本和属性,均被视为节点。
在本教程的较早章节中,我们介绍了XMLDOM,并使用了XMLDOM的getElementsByTagName()从DOM树中取回数据。
在本节中,我们将讲解一些其他较常用的XMLDOM方法。
在本例中,我们使用XML文件books.xml,并使用一个JavaScript函数把XML文件加载到名为xmlDoc的DOM对象中。
如需学习更多有关XMLDOM的知识,请访问我们的XMLDOM教程。
获取元素的值
下面的代码检索第一个
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
txt=x.nodeValue;
结果:
txt="HarryPotter"
TIY
获取属性的值
下面的代码检索第一个
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");
结果:
txt="en"
TIY
改变元素的值
下面的代码改变第一个
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
x.nodeValue="EasyCooking";
TIY
改变属性的值
setAttribute()方法可用于改变已有属性的值,或创建一个新属性。
下面的代码向每个
x=xmlDoc.getElementsByTagName("book");
for(i=0;i { x[i].setAttribute("edition","first"); } TIY 创建元素 createElement()方法创建新的元素节点。 createTextNode()方法创建新的文本节点。 appendChild()方法向节点添加子节点(在最后一个子节点之后)。 如需创建带有文本内容的新元素,需要同时创建元素节点和文本节点。 下面的代码创建了一个元素( newel=xmlDoc.createElement("edition"); newtext=xmlDoc.createTextNode("First"); newel.appendChild(newtext); x=xmlDoc.getElementsByTagName("book"); x[0].appendChild(newel); 例子解释: 1.创建 2.创建值为"First"的文本节点 3.把这个文本节点追加到 4.把 TIY 删除元素 removeChild()方法删除指定的节点(或元素)。 下面的代码片段将删除第一个 x=xmlDoc.getElementsByTagName("book")[0]; x.removeChild(x.childNodes[0]); TIY 注释: 上例的结果可能会根据所用的浏览器而不同。 Firefox把新行字符当作空的文本节点,而InternetExplorer不是这样。 您可以在w3school的XMLDOM教程中阅读到更多有关这个问题以及如何避免它的知识。 XMLDon't ∙PreviousPage ∙NextPage 您应该在使用XML时尽量避免本节列出的技术。 InternetExplorer-XML数据岛 它是什么? XML数据岛是嵌入HTML页面中的XML数据。 为什么要避免使用它? XML数据岛只在IE浏览器中有效。 用什么代替它? 您应当在HTML中使用JavaScript和XMLDOM来解析并显示XML。 如需更多有关JavaScript和XMLDOM的信息,请访问w3school的XMLDOM教程。 XML数据岛实例 本例使用XML文档"cd_catalog.xml"。 把XML文档绑定到HTML文档中的一个 id属性为数据岛定义标识符,而src属性指向XML文件: