XML基础

这篇博客介绍了XML的基础知识,包括XML的构成模块、语法、转义字符、子元素和属性的使用,以及如何结合CSS进行样式设计。此外,还详细讲解了DTD的引用、内部和外部DTD的定义,以及如何使用XMLHttpRequest对象进行数据交互。文中探讨了XMLHttpRequest的属性、方法,DOM解析XML的原理和方法,并展示了不同节点类型的属性和方法。
摘要由CSDN通过智能技术生成

XML基础


XML构成模块

  1. 元素
  2. 属性
  3. 实体
    转义字符
  4. PCDATA
    这种类型是可以被解析器解析的类型
    也就是说应当使用实体代替转义字符
  5. CDATA
    不会被解析器解析

XML语法

1. 必须有关闭标签
2. 正确的嵌套标签
3. 整个文档必须有一个根元素,也就是说所有文档都在一个元素下面
4. 属性值必须加引号
5. 会保留元素值原有格式
6. 大小写敏感

转义字符

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

子元素和属性之争

应当尽量避免使用属性:
1.属性不能表示树结构
2.属性无法做扩展

使用CSS

CSS能够渲染XML元素
1. 引入CSS:

<!xml-stylesheet type="text/css" href="path">
  1. CSS内容是针对特定的元素,进行特定的格式渲染

例子:

1.xml文件

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="attributeTest.css"?>
<!DOCTYPE computer[
<!ELEMENT computer (cpu,gpu,mainboard,ram,keyboard,display*,mouse?)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT gpu (#PCDATA)>
]>
<computer>
    <cpu>
        Intel i7
    </cpu>
    <gpu>
        GTX 750TI
    </gpu>
</computer>

2.css文件

computer{
display: block;
background-color: #fff0ff;
width:50%;
}
gpu{
display: block;
background-color: #f0ffff;
}

DTD

引用DTD

<!DOCTYPE root_element SYSTEM "xxx.dtc">

例子:
1. xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root SYSTEM "student.dtd">
<root>
    <name>zhangsan</name>
    <age>20</age>
</root>
  1. student.dtd
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

内部DTD

包含在xml文档内部,语法如下:

<!DOCTYPE root_element[
    定义
]>

外部DTD

引用文件外的DTD作为约束,语法如下:
1.xml引用语法

<!DOCTYPE root_element SYSTEM "dtd_path">
  1. dtd
定义语法

ELEMENT

用于定义元素,格式如下:

<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>

1.定义空元素

<!ELEMENT element_name EMPTY>

2.PCDATA元素

<!ELEMENT elemtn_name (#PCDATA)>

3.任何内容元素

<!ELEMENT element_name ANY>

4.子元素
1.逗号分隔规定出现顺序
spring.dtd中:

<!ELEMENT beans (
    description?,
    (import | alias | bean)*
)>

解释:

首先出现一个或者0个description元素
后面出现import或者alias或者bean 0个、多个

例子

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE computer[
<!ELEMENT computer (cpu,gpu,mainboard,ram,keyboard,display*,mouse?)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT gpu (#PCDATA)>
<!ELEMENT mainboard (#PCDATA)>
<!ELEMENT ram (size,brand)>
<!ELEMENT keyboard (#PCDATA)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT display (#PCDATA)>
<!ELEMENT mouse (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT brand (#PCDATA)>
]>
<computer>
    <cpu>
        Intel i7
    </cpu>
    <gpu>
        GTX 750TI
    </gpu>
    <mainboard>
        技嘉 840m
    </mainboard>
    <ram>
        <size>8G</size>
        <brand>金士顿</brand>
    </ram>
    <keyboard>
        ikbc
    </keyboard>

    <display>
        AOC
    </display>
    <mouse>
        雷蛇
    </mouse>
</computer>

ATTLIST

定义元素的属性,语法如下:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>
  1. 属性类型
类型描述
CDATA值为字符数据 (character data)
(en1竖线en2竖线..)此值是枚举列表中的一个值
ID值为唯一的 id
IDREF值为另外一个元素的 id
IDREFS值为其他 id 的列表
NMTOKEN值为合法的 XML 名称
NMTOKENS值为合法的 XML 名称的列表
ENTITY值是一个实体
ENTITIES值是一个实体列表
NOTATION此值是符号的名称
xml:值是一个预定义的 XML 值

2.属性默认值

解释
属性的默认值
REQUIRED属性值是必需的
IMPLIED属性不是必需的
FIXED value属性值是固定的

实体

用来定义实体,以供外界引用,如:

&lt; 表示>

语法如下:

<!ENTITY 实体名称 "实体的值">

例子:

<!ENTITY god "zhousi">

引用:

&god;

外部实体

在xml中引用外部实体:

<!ENTITY 实体名字 SYSTEM "DTD路径">

XMLHttpRequest

创建对象

1.现在

xmlhttp=new XMLHttpRequest();

2.老版本

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

所以为了兼容,两种方式都要进行:

var xmlhttp;
function ajax(){
    if(window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
    }else if(window.ActiveXObject){
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if(xmlhttp==null){
        alert("your browser does not support XMLHTTP");
    }else{
        //设置状态变化对应的处理函数
        xmlhttp.onreadstatechange=state_change();
        //打开和url的连接,参数分别是 方法 url 是否异步
        xmlhttp.open("GET",url,true);
        //发送要发送的数据
        xmlhttp.send(null);
    }
}
function state_change(){
    if(xmlhttp.readyState==4){
        //200表示成功
        if(xmlhttp.status==200){

        }else{

        }
    }
}

属性

readyState

状态名称描述
0Uninitialized初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
1Openopen() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2SentSend() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3Receiving所有响应头部都已经接收到。响应体开始接收但未完成。
4LoadedHTTP 响应已经完全接收。

每次属性值==增加==时会触发onreadystatechange方法的触发

responseXML

responseText

status

statusText

例子:

<html>
<head>
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url){
    xmlhttp=null;
    if (window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
     }else if (window.ActiveXObject){
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (xmlhttp!=null){
      xmlhttp.onreadystatechange=state_Change;
      xmlhttp.open("GET",url,true);
      xmlhttp.send(null);
      }else{
       alert("Your browser does not support XMLHTTP.");
      }
}
function state_Change(){
    document.write("readyState:"+xmlhttp.readyState+"<br/>");
    document.write("status:"+xmlhttp.status+"<br/>");
    document.write("statusText:"+xmlhttp.statusText+"<br/>");
    document.write("responseText:"+xmlhttp.responseText+"<br/>");
    document.write("responseXML:"+xmlhttp.responseXML+"<br/>");
    document.write("<br/>");
}
</script>
</head>

<body onload="loadXMLDoc('/example/xdom/test_xmlhttp.txt')">
</body>
</html>

结果:

readyState:1
status:0
statusText:
responseText:
responseXML:null

readyState:2
status:200
statusText:OK
responseText:
responseXML:null

readyState:3
status:200
statusText:OK
responseText:This is a test using an XML HTTP request to show a text file. If this text shows, it worked!
responseXML:null

readyState:4
status:200
statusText:OK
responseText:This is a test using an XML HTTP request to show a text file. If this text shows, it worked!
responseXML:null

方法

  1. abort:取消当前响应,关闭连接
  2. getAllResponseHeaders:获取HTTP相应头部
  3. getResponseHeader(String):获取相应的头部
  4. open(method, url, async, username, password)

    将readyState设置为1
    初始化各个属性
    一般不会真正打开连接

  5. send(body)

    readyState值为1
    发送HTTP请求,结合open方法的参数构成一个HTTP头
    将readyState值设为2
    如果不使用异步,将阻塞到readyState为4

  6. setRequestHeaader(name,value)
    试验xml是在同目录下的dtd/attributeTest.xml中,具体内容如下:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="attributeTest.css"?>
<computer>
    <cpu>
        Intel i7
    </cpu>
    <mainboard>
        技嘉 840m
    </mainboard>
    <gpu>
        GTX 750TI
    </gpu>
    <ram>
        <size>8G</size>
        <brand>金士顿</brand>
    </ram>
    <display>
        AOC
    </display>
    <mouse>
        雷蛇
    </mouse>
</computer>

节点类型

  1. 整个文档是一个文档节点(document)
  2. 每个 XML 标签是一个元素节点
  3. 包含在 XML 元素中的文本是文本节点,所有的文本都在文本节点中
  4. 每一个 XML 属性是一个属性节点
    注释属于注释节点

节点信息

  1. nodeName

    nodeName 是只读的
    元素节点的 nodeName 与标签名相同
    属性节点的 nodeName 是属性的名称
    文本节点的 nodeName 永远是 #text
    文档节点的 nodeName 永远是 #document

  2. nodeValue

    元素节点的 nodeValue 是 undefined
    文本节点的 nodeValue 是文本自身
    属性节点的 nodeValue 是属性的值

  3. nodeType
元素类型节点类型
元素1
属性2
文本3
注释8
文档9

例子:打印各个节点的nodeName,nodeValue,nodeType;

<!DOCTYPE html>
<html>
<head>
    <title>解析XML Node</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="loadxml.js"></script>
    <script type="text/javascript">
        function parseXMLNode(){
            var xmldoc=loadXML("dtd/attributeTest.xml");
            oneNode(xmldoc,0);
        }
        function oneNode(node,level){
            var childNodes=node.childNodes;
            for(var i = 0;i<level;i++){
                document.write("&nbsp;&nbsp;&nbsp;&nbsp;");
            }
            //打印nodeType
            document.write("Type:"+node.nodeType+"&nbsp;");
            document.write("Name:"+node.nodeName+"&nbsp;");
            document.write("Value:"+node.nodeValue);
            document.write("<br/>");
            for(var i = 0;i<childNodes.length;i++){
                oneNode(childNodes[i],level+2);
            }
        }
    </script>
</head>
<body>
<script type="text/javascript">
    parseXMLNode();
</script>
</body>
</html>

结果:

 Type:9 Name:#document Value:null
        Type:7 Name:xml-stylesheet Value:type="text/css" href="attributeTest.css"
        Type:1 Name:computer Value:null
                Type:3 Name:#text Value:
                Type:1 Name:cpu Value:null
                        Type:3 Name:#text Value: Intel i7
                Type:3 Name:#text Value:
                Type:1 Name:mainboard Value:null
                        Type:3 Name:#text Value: 技嘉 840m
                Type:3 Name:#text Value:
                Type:1 Name:gpu Value:null
                        Type:3 Name:#text Value: GTX 750TI
                Type:3 Name:#text Value:
                Type:1 Name:ram Value:null
                        Type:3 Name:#text Value:
                        Type:1 Name:size Value:null
                                Type:3 Name:#text Value:8G
                        Type:3 Name:#text Value:
                        Type:1 Name:brand Value:null
                                Type:3 Name:#text Value:金士顿
                        Type:3 Name:#text Value:
                Type:3 Name:#text Value:
                Type:1 Name:display Value:null
                        Type:3 Name:#text Value: AOC
                Type:3 Name:#text Value:
                Type:1 Name:mouse Value:null
                        Type:3 Name:#text Value: 雷蛇
                Type:3 Name:#text Value:

DOM解析

解析XML文件

  1. 通过微软的XML解析器加载XML
//创建XML文档对象
xmlDoc=new ActiveXObject("Microsoft,XMLDOM");
//关闭异步加载
xmlDoc.async="false";
//通过load方法加载xml文档
xmlDoc.load("");
  1. 其他浏览器解析
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("books.xml");

解析XML字符串

  1. 微软解析
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);
  1. 其他浏览器解析
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");

属性和方法

常见的属性

x.nodeName - x 的名称
x.nodeValue - x 的值
x.parentNode - x 的父节点
x.childNodes - x 的子节点
x.attributes - x 的属性节点

常见的方法

x.getElementsByTagName(name) - 获取带有指定标签名称的所有元素
x.appendChild(node) - 向 x 插入子节点
x.removeChild(node) - 从 x 删除子节点

例子:

function showXML(url){
    //加载xml
    var xmldoc=loadXML(url);
    //xml域测试
    alert(xmldoc.nodeName);
    alert(xmldoc.nodeValue);
    alert(xmldoc.parentNode);
    alert(xmldoc.childNodes[0].nodeValue);
    alert(xmldoc.attributes);
    //方法测试
    var cpu=xmldoc.getElementsByTagName("cpu")[0];
    alert("cpu:"+cpu.childNodes[0].nodeValue);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值