美文网首页
XML基础学习

XML基础学习

作者: 张氏小毛驴 | 来源:发表于2022-04-03 15:43 被阅读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所约束)
    

    相关文章

      网友评论

          本文标题:XML基础学习

          本文链接:https://www.haomeiwen.com/subject/diqsjrtx.html