XML解析

本文详细介绍了XML的基础,包括XML的定义、语法、属性与子元素的区别,以及XML的验证和XSD。此外,还讨论了XML在JavaScript中的应用、XML解析器的工作原理和XML DOM。进一步探讨了XML命名空间及其在避免元素冲突中的作用。
摘要由CSDN通过智能技术生成

XML解析

Extensible Markup Language:可扩展置标语言,可扩展标记语言或可延伸 标示语言,是一种置标语言

当今,XML 是非常重要的技术,并且开发项目正在使用这些基于 XML 的技术:

  • 用 XML Schema 定义 XML 的结构和数据类型
  • 用 XSLT 来转换 XML 数据
  • 用 SOAP 来交换应用程序之间的 XML 数据
  • 用 WSDL 来描述网络服务
  • 用 RDF 来描述网络资源
  • 用 XPath 和 XQuery 来访问 XML 数据
  • 用 SMIL 来定义图形

XML基础

简介

(1).什么是XML?

  • XML指可扩展标记语言
  • XML的设计宗旨是传输数据,而非显示数据
  • XML标签没有被预定义,需要自行定义标签
  • XML被设计为具有自我描述性
  • XML是W3C的推荐标准
  • XML以纯文本格式存储,是独立于软件和硬件的信息传输工具

(2).XML&HTML

  • XML被设计为传输和存储数据,其焦点是数据的内容
  • XML被设计用来显示数据,其焦点是数据的外观

树结构

<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
	<firstLeaf>firstValue</firstLeaf>
    <SecondLeaf>SecondValue</SecondLeaf>
</root>
  • 声明:定义XML版本(1.0),使用编码(ISO-8859-1)
  • 根元素:root
  • 子元素:firstLeaf SecondLeaf

语法

  • XML 文档必须有关闭标签

  • XML标签对大小写敏感

  • XML必须有根元素

  • XML的属性值需加引号

  • XML 元素必须被正确的嵌套

  • XML部分字符需要使用实体引用

    实体引用特殊符号意义
    &lt;<小于
    &gt;>大于
    &amp;&
    &apos;单引号
    &quot;"引号
  • XML的注释<!-- -->

  • XML空格会被保留,HTML连续的多个空格会合并为一个

  • XML以LF存储换行,Unix中新行以LF字符存储新行,Window换行以CR(回车符)和LF(换行符)存储

属性VS子元素

<person sex="female">
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person> 

<person>
  <sex>female</sex>
  <firstname>Anna</firstname>
  <lastname>Smith</lastname>
</person> 

以上例子通过属性和子元素都能提供相同的信息,对于什么时候使用元素或属性并没有严格的要求,经验上说,属性便利,但是如果数据感觉像信息,那么最好使用子元素

  • 属性无法博涵多重的值,子元素可以
  • 属性无法描述树结构,子元素可以
  • 属性不易扩展,且难以阅读和维护
  • 元数据(有关数据的数据)应当存储为属性,数据本身应当存储为元素

验证

(1).拥有正确语法的XML被称为“形式良好"的XML,通过DTD验证的XML是”合法“的XML

<!DOCTYPE *** SYSTEM "***.dtd">

上述例子中,DOCTYPE声明是对外部DTD文件的引用,DTD文件作用是定义XML文档的结构。它使用一系列合法的元素来定义文档结构

Q&A:DTD是什么?
DTD(文档类型定义)的作用是定义XML文档的合法构建模块,它使用一系列的合法元素定义文档结构,它可被成行地声明于XML文档中,也可作为外部引用

内部声明

<?xml version="1.0"?>
<!-- 定义此文档是note类型的文档
  		定义note元素有四个元素:to,from,heading,body
		定义元素类型为"#PCDATA"类型-->
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

外部引用

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

包含DTD的"note.dtd"文件

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

为什么使用DTD?

通过DTD,可以达到校验数据的作用,独立的团体可以一致地使用某个标准地DTD来交换数据

数据类型

PCDATACDATA
被解析的字符数据字符数据
解析器会检查文本的实体以及标记不会检查
标签作为标记处理,实体会展开标签不作为标记对待,实体不展开

(2).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> 

Q&A:Schema是什么?
XML Schema是基于XML的DTD代替者,XML Schema描述XML文档的结构,XML Schema语言也被称作XML Schema定义(XML Schema Definition**,XSD**)

XSD的作用

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

XSD较于DTD的优点

  • XSD可针对未来的需求进行扩展
  • XSD更完善,功能更强大
  • XSD基于XML编写
  • XSD支持数据类型
  • XSD支持命名空间

XSD在2001年5月2日成为W3C标准

XSD文件

<!-- 这是一个XSD文件 -->
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

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

</xs:schema>

<schema>元素是每一个XSD的根元素,<schema>元素可包含属性,如下:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示schema中用到的元素和数据类型来自命名空间http://www.w3.org/2001/XMLSchema,同时规定来自命名空间的元素和数据类型应该使用前缀xs

targetNamespace="http://www.w3school.com.cn" 

显示被此schema定义的元素(note,to,from,heading,body)来自命名空间http://www.w3school.com.cn

xmlns="http://www.w3school.com.cn" 

指出默认的命名空间是http://www.w3school.com.cn

elementFormDefault="qualified" 

指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定

XML对XSD的引用

<!-- 这是XML对XSD的引用 -->
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
xmlns="http://www.w3school.com.cn" 

规定了默认命名空间的声明,此声明会告知schema验证器,在此XML文档中所使用的的所有元素都被声明于http://www.w3school.com.cn这个命名空间

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

指拥有了可用的XSD实例命名空间

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

拥有了XSD实例命名空间,就可以使用schemaLocation属性了,此属性的两个值,http://www.w3school.com.cn指需要使用的命名空间,note.xsd指供命名空间使用的XSD的位置

验证器

如果XML文档存在错误,那么程序就不应当继续处理这个文档。

XML CSS

CATALOG
{
background-color: #ffffff;
width: 100%;
}
CD
{
display: block;
margin-bottom: 30pt;
margin-left: 0;
}
TITLE
{
color: #FF0000;
font-size: 20pt;
}
ARTIST
{
color: #0000FF;
font-size: 20pt;
}
COUNTRY,PRICE,YEAR,COMPANY
{
display: block;
color: #000000;
margin-left: 20pt;
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
</CATALOG>

XML XSLT

XSLT是首选的XML样式表语言,它远比CSS更加完善

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<breakfast_menu>
  <food>
    <name>Belgian Waffles</name>
    <price>$5.95</price>
    <description>
       two of our famous Belgian Waffles
    </description>
    <calories>650</calories>
  </food>
</breakfast_menu>

Q&A:XSL与XSLT是什么关系?
XSL和XSLT从狭义上理解是一样的,XSLT为XSL Transformations (XSL转化)

XSL:扩展样式表语言(EXtensible Stylesheet Language)是用来网页展现的,是把一个xml文件转换成一个html文件,它包含三部分

  • XSLT:一种用于转换XML文档语言(XSLT是XSL最重要的部分)
  • XPath:一种用于在XML文档中导航的语言(XSLT 使用 XPath 在 XML 文档中进行导航)
  • XSL-FO:一种用于格式化XML文档的语言(XPath 是一个 W3C 标准)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.声明部分 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- 2.用于构建模板 -->    
<xsl:template match="/">
    <HTML>
    	<HEAD>
            <TITLE>成绩单</TITLE>
        </HEAD>
        <BODY>
            <!-- 3.将模板应用于当前元素 -->
        	<xsl:apply-templates select="document"/>
        </BODY>
    </HTML>
</xsl:template>
<xsl:template match="document">
	<TABLE border="1" cellspacing="0">
        <TH>姓名</TH>
        <TH>英语</TH>
        <TH>数学</TH>
        <TH>化学</TH>
        <xsl:apply-templates select="grade"/>
    </TABLE>    
</xsl:template> 
<xsl:template match="grade">
	<TR>
    	<TD><xsh:apply-templates select="name"/></TD>
        <TD><xsh:apply-templates select="english"/></TD>
        <TD><xsh:apply-templates select="math"/></TD>
        <TD><xsh:apply-templates select="chymest"/></TD>
        <TD><xsh:apply-templates select="chymest"/></TD>
    </TR>
</xsl:template>
<xsl:template match="name">
    <!-- 4.用于提取节点值 -->
	<xsl:value-of/>
</xsl:template>
<xsl:template match="english|math|chymest">
	<xsl:choose>
    	<xsl:when test=".[value()$ge$85]">优秀</xsl:when>
        <xsl:when test=".[value()$ge$70]">一般</xsl:when>
        <xsl:when test=".[value()$ge$60]">及格</xsl:when>
        <xsl:otherwise>不及格</xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

XML JavaScript

XMLHttpRequest

XMLHttpRequest对象用于在后台与服务器交换数据,通过该对象,开发者可以

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据

现在的浏览器都支持XMLHttpRequest对象

xmlhttp = new XMLHttpRequest();
//老版本的IE
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

XML解析器

(1)解析XML

所有现代浏览器都有读取和操作XML的内建XML解析器,解析器把XML载入内存,然后把它转换为可通过JavaScript访问的XML DOM对象

(2)解析XML文档

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解析器
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";  	//关闭异步加载,确保在文档完全加载之前解析器不会继续脚本的执行
xmlDoc.load("note.xml");
//其它方法:其它浏览器
var xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("note.xml");

(3)解析XML字符串

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 DOM

DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点

/*
xmlDoc:由解析器创建的XML文档
getElementsByTagName("to")[0]:第一个<to>元素
childNodes[0]:<to>元素的第一个子元素(文本节点)
nodeValue:节点的值(文本本身)
*/
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue

而HTML DOM则是通过document.getElementById("to").innerHTML=则是通过HTML DOM引用来改变id=“to” 的HTML元素的文本

XML to HTML

<html>
<body>

<script type="text/javascript">
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","cd_catalog.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;

document.write("<table border='1'>");
var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
  {
  document.write("<tr><td>");
  document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
  document.write("</td><td>");
  document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
  document.write("</td></tr>");
  }
document.write("</table>");
</script>

</body>
</html>

XML高级

1.XML命名空间(xmlns)

XML命名空间提供避免元素命名冲突的方法,XML中,元素名称都是开发者定义的,当两个不同的文档使用相同的元素名且被放在一起使用时,就会发生命名冲突,XML解析器无法确定如何处理这类冲突

(1).通过使用前缀来避免

<h:table>
	<h:tr>
    </h:tr>
</h:table>

(2).通过使用命名空间来避免

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

与仅仅使用前缀不同,我们为<table>标签添加了一个xmlns属性,这样就为前缀h赋予了一个与某个命名空间相关联的限定名称

XML命名空间属性被放置于元素的开始元素之中

<!-- 标识命名空间的地址不会被解析器用于查找信息,其唯一作用就是赋予命名空间一个唯一的名称,许多公司常会用来指向实际存在的网页,这个网页包含命名空间的信息 -->
xmlns:namespace-prefix="namespaceURI"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值