XML学习笔记
一、XML基本语法
1.所有XML元素都必须有关闭标签。最开头的XML声明不是XML元素,不需要关闭标签。只有一个根节点。
2.XML标签对大小写敏感。
3.XML文档必须有根元素
4.XML的属性值必须加引号,可以单引号,也可以双引号。
5.转义字符:< < > > $amp; & ' ' " "
6.XML标签中的属性可以用子元素来代替,好处是可以包含更多的子元素和文本内容。
7.XML文件可以用浏览器来查看是否合法。
二、XML显示技术
1.XML可以使用css进行样式美化,具体用法与HTML一样,在XML中声明<?xml-stylesheet type="text/css" href="test.css"?> 但这种方法不常用。
2.XML可以采用引用xslt文件(属于XML文件,拓展名为.xsl)的方法来显示,在该文件中可以使用HTML代码。
(1)两种引用方式,
第一种
代码如下:
<?xml-stylesheet version="1.0" type="text/xsl" href="test.xsl"?>
还可以通过JavaScript的ActiveXObject来分别加载XML和XSLT文件,然后使用XML对象的转换函数应用到XSLT对象进行转换。代码如下:
<html>
<body>
<script type="text/JavaScript">
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.load("test.XML");
var xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.load("test.xsl");
document.write(xml.transformNode(xsl));
</script>
</body>
</html>
(2)创建模板在XSLT文件中还需要创建模板,每个模板含有当XML中某个指定节点被匹配时所应用的规则语句如下:
<xsl:template match="/">
match="/" 表示匹配XML的整个文档。
(3)提取某个节点的值使用<xsl:value-of>方法。
<xsl:value-of select="name"/>
(4)循环遍历 <xsl:for-each>
<xsl:for-each select="books/book">
<h1><xsl:value-of select="name"/></h1>
</xsl:for-each>
(5) select的属性值是一个XPath值,如select="books/book[@isbn > '999' ]" @后面是指定过滤条件,例子中指的是isbn属性大于999的节点。(6)xsl可以指定节点的元素进行排序
<xsl:sort select="id"/>
(7)添加条件测试,<xsl:if>其中有个必选参数,test="expression",若表达式的值为真,则执行里面的内容。
<xsl:if test="id = 1">
<h1><xsl:value-of select="name"/></h1>
</xsl:if>
(8)多重条件测试 <xsl:choose>,需要结合<xsl:when>和<xsl:otherwise>,when也有个必选参数test="expression",与<xsl:if>类似,otherwise则是否则情况。
<xsl:for-each select="books/book">
<xsl:choose>
<xsl:when test="id = 1">
<h1><xsl:value-of select="name"/></h1>
</xsl:when>
<xsl:otherwise>
<h6><xsl:value-of select="name"/></h6>
</xsl:otherwise>
</xsl:choose>
(9)子模版创建以及调用子模版,<xsl:template match="child">...</xsl:template>写在父模板外面,就像是主函数外面的子函数一样,可以通过<xsl:call-template name="child"/>调用。子模版代码:
<xsl:template name="child">
<xsl:choose>
<xsl:when test="id = 1">
<h1><xsl:value-of select="name"/></h1>
</xsl:when>
<xsl:otherwise>
<h6><xsl:value-of select="name"/></h6>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
调用子模版代码:
<xsl:for-each select="books/book">
<xsl: call-template match="child"/>
</xsl:for-each>
三、XML格式定义技术
有DTD和XML Schema两种方法,XML Schema比DTD有更多优势,以.xsd为扩展名。
四、XML JavaScript解析技术
1.加载XML文档
function loadxmlDoc(file){//自定义函数
if(window.ActiveXObject){//IE
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}else{Firefox, Mozilla, Opera, etc
xmlDoc=document.implementation.createDocument("","",null);
}
try{
xmlDoc.async=false;
xmlDoc.load(file);//chrome没有load方法
}catch(e){
//针对Chrome,不过只能通过http访问,通过file协议访问会报错
var xmlhttp = new window.XMLHttpRequest();
xmlhttp.open("GET",file,false);
xmlhttp.send(null);
xmlDoc = xmlhttp.responseXML.documentElement;
}
return xmlDoc;
}
2.读取并显示数据
重要方法:
xmlDoc.getElementsByTagName("book") 获取xmlDoc节点下的<book>...</book>的集合。括号里参数不能写根节点。
x.childNodes 获取x子节点的集合,一般用x.childNodes[i]获取第i个子节点,要注意的是如<name>Java</name>,<name>是一个元素节点,其中有个子节点是文本节点"Java",值为Java,"Java"不是<name>节点的值,所以要获得Java这个值要通过 getElementsByTagName("name")[0].childNodes[0].nodeValues。
nodeValue获取某个节点的值。
示范代码如下:
var ob=loadxmlDoc("test.XML");
var x=ob.getElementsByTagName("book");
for(var i=0;i<x.length;i++){
var name=x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue;
var id=x[i].getElementsByTagName("id")[0].childNodes[0].nodeValue;
document.write(name + "<br>");
document.write(id + "<br>");
}
document.write(x);
注意:要将html页面放到服务器目录下,并通过localhost访问,不然浏览器会报错。