XML基础学习

2022-04-03  本文已影响0人  张氏小毛驴
  1. XML概念

    XML是可扩展标记语言(对比HTML是超文本标记语言)。

    主要是用来传输和存储数据,XML的标签没有被预定义,可以自定义标签

  2. XML和HTML区别

    • xml的标签都是自定义的,html的标签是预定义的。
    • xml的语法严格,html宽松
    • xml用于传输和存储数据,html用于显示数据
  3. XML结构

    XML文档形成了一种树结构,有且只有一个根节点,是所有其他元素的父元素。

    以下是一个简单的XML:

    <?xml version="1.0" encoding="utf-8" ?>
    <school>
     <student>
            <name>张三</name>
            <age>18</age>
        </student>
        <student>
            <name>李四</name>
            <age>25</age>
        </student>
    </school>
    

    第一行是XML声明,定义了XML版本(1.0)和使用的编码集(UTF-8)

    school是根元素(就比如是解释了这是一个学校)

    接下来的student是school的子元素,name和age又是student的子元素,两个student是同级元素。

    整个XML的结构可以如下图表示:

xml.png
  1. XML语法

    • xml文档后缀名为.xml
    • 所有XML元素都必须关闭标签。(XML声明不算,因为他不是XML元素)
    • XML标签对大小写敏感
    • XML文档必须有根元素
    • XML元素必须正确的嵌套(不能你中有我,我中有你)
    • XML的属性值必须有引号(单引号或双引号都可以)
    • XML注释:``
  2. XML文档声明

    • 格式:<?xml 属性列表 ?>
    • 属性列表
      • version:版本号,是必须要有的属性
      • encoding:编码方式
      • standalone:是否独立。yes:不依赖其他文件;no:依赖其他文件
  3. XML标签元素

    • 命名规则
      • 可以包含字母,数字以及其他字符
      • 不能以数字或者标点符号开头
      • 名字不能以字符xml或者XML,Xml开始
      • 名字不能包含空格
  4. XML属性

    XML元素可以在开始标签中包含属性(与HTML类似)。

    属性用于提供关于元素的额外信息。

    XML属性必须加引号(单双引都行)

    id属性是唯一的

  5. XML文本

    所有的XML文档中的文本都会被解析器解析,只有CDATA区段的文本会被解析器忽略

    当某个XML元素被解析时,其标签之间的文本也会被解析。之所以这样子原因是XML元素是可以包含其他元素的,比如以下例子,name标签中包含着另外的两个标签firstName和lastName.

    <name><firstName>zhang</firstName><lastName>san</lastName></name>

    解析器会把文本解析为子元素,如下:

    <name>
    <firstName>zhang</firstName>
    <lastName>san</lastName>
    </name>
    

    CDATA:指的是不应由XML解析器进行解析的文本数据。

    在XML中,<&是非法的,会产生错误,因为XML会去解析,但某些文本,比如JavaScript代码,会包含大量的<或者&字符,为了避免错误,可以将代码部分定义为CDATA(XML不会解析,原封不动的展示)

    CDATA使用格式:<![CDATA[代码块]]>

    <script>
    <![CDATA[
    function fun() {
     console.log("hello JavaScript");
    }
    ]]>
    </script>
    
  6. XML约束

    因为XML是可扩展的,而且标签时可以自定义的,因此只要满足xml的要求,就可以写出一个xml文件。但是在实际开发中,主要是使用框架,需要给xml引入一些语法,用来检测xml文件是否编写正确。

    也就是说,约束其实就是用来规定XML的书写规则的。

    (作为框架的使用者,只需要满足能够在xml中引入约束文档以及能够简单的读懂约束文档就行了)。

    XML主要有两种类型的约束:

    • DTD约束(一种简单的约束技术)(细节可以参考:https://cloud.tencent.com/developer/article/1019644)

      • 引入dtd文档到xml的方式:

        1. 内部dtd:将约束的规则定义在xml文档中
        2. 外部dtd:将约束的规则定义在外部的dtd文件中
          • 本地文件:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置" >
          • 网络文件:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
      • 基本语法

        <!ELEMENT 元素名 类型>

      示例:以一个班级为例子编写dtd文件 class.dtd

      <!ELEMENT class (student+)>
      <!ELEMENT student (name,age)>
      <!ELEMENT name (#PCDATA)>
      <!ELEMENT age (#PCDATA)>
      

      解释:第一行表示根元素为class,并且class里有1个或多个student子元素;

      第二行表示student的子元素有name和age;

      第三行和第四行表示name和age下都没有子元素,#PCDATA表示可以放任意文本

      编写class.xml文件并引入dtd文件

      <?xml version="1.0" encoding="utf-8" ?>
      <!-- 引入dtd,约束该xml-->
      <!DOCTYPE class SYSTEM "class.dtd">
      <class>
         <student>
             <name>张三</name>
              <age>18</age>
          </student>
          <student>
             <name>李四</name>
              <age>24</age>
          </student>
      </class>
      

      以上xml打开是不会报错的,这里借助IE来校验(IE5以上的浏览器内置了XML解析工具),编写以下html

      <html>
          <head>
          <!--自己编写一个简单的解析工具,去解析XML DTD是否配套-->     
          <script language="javascript">
              // 创建xml文档解析器对象
              var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
              // 开启xml校验
              xmldoc.validateOnParse = "true";
              // 装载xml文档,即指定校验哪个XML文件
              xmldoc.load("class.xml");
              document.writeln("错误信息:"+xmldoc.parseError.reason+"<br>");
              document.writeln("错误行号:"+xmldoc.parseError.line);
          </script>
      
          </head>
          <body>
      
          </body>
      </html>
      

      就会出现报错:

      dtd.png
 示例:编写personSchema.xsd

 ~~~xsd
 <?xml version="1.0" encoding="UTF-8"?>
 <xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema"    
             xmlns="http://www.example.org/personSchema"
             targetNamespace="http://www.example.org/personSchema"
             elementFormDefault="qualified">                            <!--讲解1-->
 <xs:element name='persons'>                               <!--约束xml根元素为persons-->
     <xs:complexType>                                       <!--complexType:定义persons为复合元素-->
         <xs:sequence maxOccurs='unbounded '>               <!--讲解2-->
             <xs:element name='person'>                     <!--约束persons下的子元素名字必须为person-->  
                 <xs:complexType>
                    <xs:sequence>                          <!--sequence:必须按照顺序实现:先有姓名,最后年龄.-->
                        <xs:element name='姓名' type='xs:string' />
                        <xs:element name='性别' type='xs:string' />
                        <xs:element name='年龄' type='xs:string' />
                    </xs:sequence>
                 </xs:complexType>
             </xs:element>
         </xs:sequence>
     </xs:complexType>
  </xs:element>
 </xs:schema>
 ~~~

 >讲解1:
 >
 >**xmlns:xs=http://www.w3.org/2001/XMLSchema**
 >
 >- 约束XML里使用xs:作前缀的元素、属性、类型等名称的变量是属于http://www.w3.org/2001/XMLSchema命名空间的。
 >
 >**xmlns=[http://www.example.org/personSchema](http://www.example.org/personSchema)**
 >
 >- 表示默认的命名空间是[*http://www.example.org/personSchema*](http://www.example.org/personSchema),也就是指定未使用任何前缀的元素、数据的命名空间为它.
 >
 >**targetNamespace="http://www.example.org/personSchema"**
 >
 >- 显示被此 schema 定义的元素来自命名空间: [*http://www.example.org/personSchema*](http://www.example.org/personSchema)
 >
 >讲解2:
 >
 >**<xs:sequence maxOccurs='unbounded'>**
 >
 >- sequence表示必须按照顺序实现, **maxOccurs=*'unbounded'**表示可以有多个相同的,比如上面就是表示persons里可以有多个person.

 创建对应的XML:

 ~~~xml
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- 
    1.填写xml文档的根元素
    2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
    4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml"    
  -->
 <p:persons xmlns:p="http://www.example.org/personSchema"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
   <p:person>
     <p:姓名>p:张三</p:姓名>
     <p:性别>p:男</p:性别>
     <p:年龄>p:22</p:年龄>
   </p:person>
   <p:person>
     <p:姓名>p:李四</p:姓名>
     <p:性别>p:男</p:性别>
     <p:年龄>p:17</p:年龄>
   </p:person>
 </p:persons>
 ~~~

 >**xmlns:p="http://www.example.org/personSchema"**
 >
 >- 表明此schema中使用的前缀为p:的元素和数据类型来自于"http://www.example.org/personSchema"名称空间
 >
 >**xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"**
 >
 >- 指定定义的XML实例名称空间规范格式.默认都以这个2001版本为使用
 >
 >**xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">**
 >
 >- 指定我们使用的"http://www.w3.org/2001/XMLSchema"名称空间的约束格式为personSchema.xsd约束文件的内容(也就是说该xml被personSchema.xsd所约束)
上一篇下一篇

猜你喜欢

热点阅读