一、前言
在学习Autosar时了解到ARXML这种文件格式,在网上搜索资料学习时,发现ARXML文件实质是一种XML文件。那么XML是什么呢,ARXML与XML之间的区别又在哪里呢?
一般通过Autosar标准的XSD进行约束,用专用的工具Artop,Systemdesk,Matlab,DaVinci developer,Autosar Explorer…生成。和XML文件一样,ARXML是一个通用的配置/数据库文件,所以这里只需了解ARXML文件的结构(方便在将ARXML导入工具时,能够检查一些基本的错误),无需想着用过多的时间手动生成它(生成的工作,专业工具已经帮你做解决了)。
二、XML简介
- XML:指可扩展标记语言,被设计用来结构化、存储以及传输信息。因此,XML经常被用来充当"配置文件"和"数据库",一般可通过"Eclipse"和"网页浏览器"等软件工具打开XML文件。
将ARXML文件的后缀名修改为XML,可以通过这些工具打开
- XML不会做任何事情。如下实例所示,它包含了发送者和接受者的信息,同时拥有标题及信息主体。但是,这个XML文档仍然没有做任何事情,它仅仅是包装在XML标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档
<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Do not forget me this weekend!</body> </note>
三、XML用途
-
XML把数据从HTML分离
1、如果需要在HTML文档中显示动态数据,那么每当数据改变时,将花费大量时间来编辑HTML。通过XML,数据能够存储在独立的XML文件中。这样开发人员可以专注于使用HTML/CSS进行显示和布局,并确保修改底层数据不再需要对HTML进行任何的改变通过使用几行JavaScrip代码,就可以读取一个外部XML文件,并更新网页的数据内容
2、XML数据以纯文本的方式进行存储,因此提供了一种独立于软件和硬件的数据存储方式,这让创建不同应用程序可以共享的数据变得更加容易。
四、XML文件内容
-
XML文档是树状结构,如下图所示:
-
下面根据实例具体分析:
<?xml version ="1.0" encoding ="utf-8"?> <bookstroe> <!-- This is a comment --> <book category = "Children"> <title>Harry Potter</title> <author>J K. Rowing</auto> <year>2005</year> <price>35.5</price> </book> <book category = "WEB"> <title>Learning XML</title> <author>Erik T.Ray</auto> <year>2003</year> <price>39.95</price> </book> </bookstore>
1、第1行:XML声明。第一列,声明语句之前,不能有任何的空格和注释。定义了XML版本和编码信息。其中,版本永远都是1.0;编码方式一般都使用UTF-8(该编码支持中文标签)。
2、 第2行:根元素,XML有且仅有一个根元素。元素由开始标签、元素内容、结束标签组成,没有被其它元素包围的元素称为根元素;
3、第3行:注释的写法:<!—注释内容–>,但不能嵌套使用。
4、第4行:"category = “Children”"表示属性。
-
属性必有值,值必须使用引号(单引号,双引号)
-
如果属性值本身包含双引号,可以使用单引号将值括起,也可以引用字符实体,如下所示:
<gangster name = 'George "Shotgun" Ziegler'> <gangster name = "George "Shotgun" Ziegler">
-
属性其实是描述标签一些额外的信息,一个标签可以有多个属性。可以将属性看为元素的另一种写法。
-
属性不能包含多个值(元素可以)
-
属性不能包含树结构(元素可以)
5、第5~8行:表示元素。XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。一个元素可以包含其他元素、文本、属性等。
注意
1、XML中的标签区分大小写,对应的开始标签和结束标签必须大小写一致。
2、所有的XML元素都必须有一个关闭标签,例如<title>必须对应关闭标签</title>
3、标签对大小写敏感。标签<Letter>和<letter>是不同的,必须使用相同的大小写来编写打开标签和关闭标签:<Message>这是错误的</message> <message>这是正确的</message>
4、在XML中,所有元素都必须彼此正确的嵌套,如下实例所示,由于<i>元素是在<b>元素内打开的,那么他必须在<b>元素内关闭
<b><i>这是错误的示范</b></i> <b><i>这是正确的示范</i></b>
5、实体引用
在XML中,一些字符拥有特殊含义,例如字符"<"在XML元素中,会发生错误,因为解析器会把它当做新元素的开始<!--Fault--> <message>if salary < 1000 then</message>
为了避免出现错误,一般使用实体引用来代替"<"字符
<message>if salary < 1000 then</message>
6、一般XML中常见实体引用如下所示
-
实体 | 引用 | 含义 |
---|---|---|
< | < | less than |
> | > | greater than |
& | & | ampersand |
' | ’ | apostrophe |
" | " | quotation mark |
五、XML命名规则
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
六、有效的XML
一般使用DTD和XSD(XML Schema)定义语义约束。ARXML文件使用XSD进行约束。
认识DTD
-
DTD简介
1、 DTD(Document Type Definition),用于约束XML的文档格式,保证XML是一个有效的XML(要求开发者书写XML时只能按照DTD定义的格式写)。定义好接口和格式,方便多个人同时开发。DTD可以分为内部DTD和外部DTD。2、DTD和XML的关系:类和对象;数据库(表)和行(一条记录)
3、DTD的缺点:
- DTD约束XML的时候,不能对XML中数据类型做详细的限定
- DTD约束有自己的语法,书写时必须遵守DTD的语法;
- 一个XML文件中只能引入一个DTD约束,而无法通过多个DTD文件来约束同一个XML文件
-
内部的DOCTYPE声明(内部DTD定义语法)
1、 <!DOCTYPE 根元素 [元素声明]>
2、 元素声明语法:<!ELEMENT 元素名 (子元素[,子元素…])>
3、 数量词:- +:表示元素出现至少出现一次
- ?:表示元素出现0次或1次
- *:表示元素出现任意次。举例<!ELEMENT books (book*)>
4、属性声明语法:
- 属性类型:CDATA,表示字符数据(character data)
- 默认值:
#REQUIRED,表示必须出现
#IMPLIED,表示不是必须出现
5、带内部DTD的完整XML如下
<?xml version ="1.0" encoding ="utf-8"?> <!--DID--> <!DOCTYPE 书店 [ <!ELEMENT 书店 (book+)> <!ELEMENT book (title,author,year,price)> <!ATTLIST book category CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <书店> <!--This is a comment--> <book category = "Children"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>35.5</price> </book> <book category = "WEB"> <title>Learning XML</title> <author>Erik T.Ray</author> <year>2003</year> <price>39.95</price> </book> </书店>
使用浏览器显示XML文件如下图所示:
-
外部的DOCTYPE声明
1、 创建一个独立的外部DTD文件,如下所示<?xml version ="1.0" encoding ="utf-8"?> <!--DID--> <!ELEMENT 书店 (book+)> <!ELEMENT book (title,author,year,price)> <!ATTLIST book category CDATA #REQUIRED> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT price (#PCDATA)>
2、 在XML文件中引入外部的DTD文件,语法:<!DOCTYPE 根元素 SYSTEM"文件名">,带外部引用DTD文件的XML如下所示:
<?xml version ="1.0" encoding ="utf-8"?> <!DOCTYPE 书店 SYSTEM "C:\Users\taofangfang\Desktop\1.dtd"> <书店> <!--This is a comment--> <book category = "Children"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>35.5</price> </book> <book category = "WEB"> <title>Learning XML</title> <author>Erik T.Ray</author> <year>2003</year> <price>39.95</price> </book> </书店>
认识XSD
-
XSD简介
1、 XSD全称:XML结构定义(XML Schema Definition),是DTD的替代者。
2、不仅可以定义XML文档的结构,还可以规范XML文档的内容。XSD本身也是XML文档。
3、功能如下:- 定义可出现在文档中的元素和属性;
- 定义哪个元素是子元素;
- 定义子元素的次序;
- 定义子元素的数目;
- 定义元素是否为空,或者是否可包含文本;
- 定义元素的数据类型;
- 定义元素和属性的默认值以及固定值。
- . 允许开发这自定义数据类型
- 可读性强;可针对未来需求进行扩展
- 一个XML中可以引入N个Schema进行约束。
- 书写的时候,它遵守XML的语法规则,它的文件扩展名XSD。
-
XSD文件内容
1、 不管是XML还是XSD文件,都需要被约束。对Schema头部约束步骤如下
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/bookstore" xmlns:tns="http://www.example.org/bookstore" elementFormDefault="qualified"> <!-- 具体约束内容 --> </schema>
- xmlns=“http://www.w3.org/2001/XMLSchema”:显示schema约束中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchma",有时这行代码也会写成"xmlns:xs=“http://www.w3.org/2001/XMLSchema”“,显示schema约束中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchma”,同时元素名前需带有前缀xs
>此行代码固定
- targetNamespace=“http://www.example.org/bookstore” :声明被此Schema定义的元素属于命名空间"http://www.example.org/bookstore"(只是声明,而不能说当前Schema默认使用该命名空间)。example部分可以自己定义,bookstore为根标。
- xmlns:tns=“http://www.example.org/bookstore”:默认命名空间。
- elementFormDefault=“qualified” :指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定。
此行代码固定
2、Schema约束的具体约定:
将此段代码插入上个代码段的“具体约束内容”部分
<element name="students"> <complexType> <sequence> <element name="student" minOccurs="1" maxOccurs="unbounded"> <complexType> <sequence> <element name="name" type="string" minOccurs="1" maxOccurs="1"> <element name="sex"> <simpleType> <annotation> <documentation>只能为男或者女</documentation> </annotation> <restriction base="string"> <enumeration value="男"> <enumeration value="女"> </restriction> </simpleType> </element> <element name="age" minOccurs="1" maxOccurs="1"> <simpleType> <annotation> <documentation>年龄必须在15~50岁</documentation> </annotation> <restriction base="int"> <minInclusive value="15"> <maxInclusive value="50"> </restriction> </simpleType> </element> <element name="subjects" minOccurs="1" maxOccurs="1"> <complexType> <sequence> <element name="subject" minOccurs="1" maxOccurs="3" type="string"> <annotation> <documentation>主修科目最少为一门,最多为三门</documentation> </annotation> </element> </sequence> </complexType> </element> </sequence> <!--注意属性约束的位置 --> <attribute name="id" type="int" use="required"> </complexType> </element> </sequence> </complexType> </element>
- <complexType>&<simpleType>:当一个元素(称为A)的子元素(称为B)存在子元素(称为C)时,必须使用<complexType>标签包裹元素B,如果不满足上述条件则必须使用<simpleType>包裹元素B
- <sequence>&<all>&<choice>:<sequence>表示元素出现的顺序必须是schema约束中的顺序;<all>表示元素可以以任意顺序出现;<choice>表示简单元素只能出现一个。
- <annotation>&<documentation>:<annotation>包裹部分表示注解,<documentation>包裹部分为注解内容。
- <restriction>:此标签包裹用来写限制内容。
- <maxInclusive value=“max”/>&<minInclusive value=“min”/>:约束范围为min~max。
- <enumeration value="/>:约束值只能为枚举值中的一个
- <attribute>:给指定的元素加入属性约束
注意:
1、数据类型有很多种,如string,int,Integer等等,注意的是,在element标签中是写type,在restriction标签是写base。
2、数量约束:minOccurs约束标签最少出现的次数,maxOccurs约束标签最多出现的次数,其中unbounded表示无穷次。
3、属性:要给哪个元素添加属性约束就必须在属于该元素的部分的使用<attribute>标签来约束,其中use=“required”,表示属性是必须的,没有就会报错。 -
在xml文件中引入Schema约束(如下图第2-4行所示)
<?xml version ="1.0" encoding ="utf-8"?> <students xmlns="http://www.w3cschool.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3cschool.com.cn students.xsd "> <student id = "1"> <name>Harry Potter</name> <!-- 只能是男或者是女 --> <sex>男</sex> <!-- 年龄必须在15~50岁 --> <age>18</age> <!-- 主修科目最少为一门,最多为三门 --> | <subject>Math</subject> <subject>English</subject> <subject>Chinese</subject> </student> <student id = "2"> <name>Charliy</name> <!-- 只能是男或者是女 --> <sex>4</sex> <!-- 年龄必须在15~50岁 --> <age>16</age> <!-- 主修科目最少为一门,最多为三门 --> <subject>Math</subject> <subject>English</subject> </student> </students >
- xmlns=“http://www.example.org/students”:写schema约束中的targetNamespace的地址 ;
- xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”]:格式固定
- xsi:schemaLocation="http://www.example.org/students"这一行代码中地址写schema约束文档的 xmlns:tns= 的地址,students.xsd是Schema约束文档的文件名