XML学习

Posted 钟文涛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML学习相关的知识,希望对你有一定的参考价值。

XML

xml值可扩展标记语言(eXtensible Markup Language)

xml被设计用来传输和存储数据

xml可以是有效的

  • 符合其文档类型定义(DTD)的文档
  • xml标签没有被预定义,需要自行定义标签。
  • 如果一个文档符合一个模式(schema)的规定,那么这个文档是模式有效的(schema valid)##

XML和HTML的区别

  • 其实HTML与XML之间没有非常必然的联系,XML不是要替换HTML,实际上XML可以视作对HTML的补充

  • XML和HTML 的目标不同:HTML 的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容

  • 与HTML相似,XML不进行任何操作

  • 与 HTML 不同,XML 标记由架构或文档的作者定义,并且是无限制的。HTML 标记则是预定义的;HTML 作者只能使用当前 HTML 标准所支持的标记

    XML是被设计用来描述数据的,HTML是被设计用来显示数据的。

XML语法

XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶",第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(encoding="utf-8"),一个XML有且只有一个根,所有的元素都可以有子元素,父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹),所有的元素都可以有文本内容和属性

示例:

<!--描述一个书的信息-->
<?xml version="1.0" encoding="utf-8"?>
<books>
	<title>XML</title>
    <author>钟文涛</author>
    <price>12.6</price>
</books>

XML格式

  • 所有的 XML 元素都必须有一个关闭标签

  • XML 标签对大小写敏感

  • 必须正确嵌套

  • 文档必须有根元素

  • 属性值必须加引号

  • 实体引用

    <!--&lt  <	&gt  >	&amp &	&apos \'	&quot "   -->
    因为xml在浏览器解析器解析的时候,向< >这些都是会被解析的
    所以你就想单纯输出一段文本 你就用以上实体代替
    示例:
    你想输出
    <div>XML</div>
    你就改成
    &lt div > xml < /div &g
    
    
  • XML 中的注释

    <!-- This is a comment -->
    
  • 在 XML 中,空格会被保留

  • PCDATA

    parsed character data:是会被解析器解析的文本

  • CDATA

    character data:是不会被解析器解析的文本,CDATA是在XML文档里面使用的关键字,用来告诉浏览器,这部分内容不用解 析,是给其他程序用的,比如js代码等。CDATA 部分由 "" 结束:

XML验证器

拥有正确的语法的XML被称为“格式良好的xml文件”

符合模式定义的XMl文件是有效的xml文件(同时它也是格式良好的xml文件)

为什么要使用验证器?

  1. 每一个 XML 文件均可携带一个有关其自身格式的描述
  2. 独立的团体可一致地使用某个标准的 DTD 来交换数据
  3. 应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据
  4. 还可以使用 DTD 来验证自身的数据

1.1 DTD

​ DTD 的目的是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD定义的两种类型 注意:区别大小写!

  • 内部的DOCTYPE声明

    <!DOCTYPE root-element [element-declarations]>
    

    示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE books [
    	<!ELEMENT books (book*)>
    	<!ELEMENT book (title, price, (publisher | author))>
    	<!ELEMENT title (#PCDATA)>
    	<!ELEMENT price (#PCDATA)>
    	<!ELEMENT publisher (#PCDATA)>
    	<!ELEMENT author (#PCDATA)>
    ]>
    <books>
    	<book>
    		<title>XML</title>
    		<price>99</price>
    		<publisher>dddddd</publisher>
    	</book>
    </books>
    
    
  • 外部文档声明

    <!DOCTYPE root-element SYSTEM "filename">
    

    示例:

    <!--a.dtd-->
    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT books (book*)>
    <!ELEMENT book (title, price)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    <!--a.xml-->
    <!DOCTYPE books SYSTEM \'a.dtd\'>
    <books>
    	<book>
    		<title/>
    		<price/>
    	</book>
    </books>
    
    
    

    DTD语法规则—元素

    <!ELEMENT element-name category>
    category
    空元素: EMPTY
    PCDATA: (#PCDATA)
    任何内容: ANY
    带有子元素的元素: (child1,child2,...)
    出现一次的子元素: (child-name)
    至少出现一次的子元素: (child-name+)
    出现零次或多次的元素: (child-name*)
    出现零次或一次的元素: (child-name?)
    或: (child1 | child2 | ...)
    

    DTD语法规则—属性

    <!ATTLIST element-name attribute-name attribute-type attribute-value>
    element-name 元素名
    attribute-name 属性名
    attribute-type 属性类型
    attribute-value 属性默认值
    
    • 属性类型

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

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

    示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT books (book*)>
    <!ELEMENT book (title, price, (publisher | author))>
    <!ATTLIST book id ID #REQUIRED>
    <!ELEMENT title (#PCDATA)>
    <!ATTLIST title subtitle CDATA #IMPLIED>
    <!ELEMENT price (#PCDATA)>
    <!ATTLIST price unit (人民币|美元) "人民币">
    <!ELEMENT publisher (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    
    

1.2 Schema

XML Schema是DTD的升级版

优点:

  1. 可更容易地描述允许的文档内容
  2. 可更容易地验证数据的正确性
  3. 可更容易地与来自数据库的数据一并工作
  4. 可更容易地定义数据约束(data facets)
  5. 可更容易地定义数据模型(或称数据格式)
  6. 可更容易地在不同的数据类型间转换数据

1. schema基本结构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.trkj.com"
    xmlns="http://www.trkj.com"
	elementFormDefault="qualified" 
	attributeFormDefault="unqualified">
</xs:schema>
qualified: 使用命名空间
unqualified: 不使用命名空间

2. 语法规则—元素

<xs:element name=“元素名” type=“元素类型“ default=”默认值” fixed=“固定值" />
常用类型:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time

**3. 语法规则—属性 **

<!--默认没有use属性,表示可有可无,”required”表示属性一定要有-->
<xs:attribute name=“属性名” type=“类型““default=”默认值” fixed=“固定值“ use=“required|optional” />
常用属性类型:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time

4. Schema语法规则 – complexType 复杂类型

complexType 元素用于定义复杂元素,复杂元素是指包含其他元素及/或属性的 XML 元素。

四种类型的复杂元素:

  1. 空元素
  2. 包含其他元素的元素
  3. 仅包含文本的元素
  4. 包含元素和文本的元素

注意: 上述元素均可包含属性!

  • 复杂类型元素--空元素

    空元素,空元素不能包含内容,只能含有属性。

    示例:

    <xs:element name="address">
    	<xs:complexType/> 或
        <xs:complexType></xs:complexType>
    </xs:element>
    或
    <xs:element name="product">
      <xs:complexType>
      <xs:attribute name="prodid" type="xs:positiveInteger"/>
      </xs:complexType>
    </xs:element>
    
  • 复杂类型元素--仅包含子元素

    仅包含子元素的复杂类型元素是只能包含其他元素的元素

    示例:

    <xs:complexType>
    	<xs:sequence>
    		<xs:element name="title" type="xs:string"/>
    		<xs:element name="price" type="xs:decimal"/>
    	</xs:sequence>
    </xs:complexType>
    xs:sequence 表示书写必须按顺序
    
  • 复杂类型元素--仅包含文本

    仅包含文本,仅含文本的复杂元素可包含文本和属性,并且必须在 simpleContent 元素内定义扩展或限定

    示例:

    <xs:element name="phone">
    	<xs:complexType>
    		<xs:simpleContent>
    			<xs:extension base="xs:integer">
    			<xs:attribute name="area" type="xs:integer"></xs:attribute>
    			</xs:extension>
    		</xs:simpleContent>
    	</xs:complexType>
    </xs:element>
    
  • 复杂类型元素--混合元素(mixed)

    如果元素即有标签体文本,又有属性,则称之为mixed元素

    示例:

    <xs:element name="letter">
      <xs:complexType mixed="true">
        <xs:sequence>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="orderid" type="xs:positiveInteger"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    为了使字符数据可以出现在 "letter" 的子元素之间,mixed 属性必须被设置为 "true"。<xs:sequence> 标签 (name、orderid ) 意味着被定义的元素必须依次出现在 "letter" 元素内部。
    <letter>
    Dear Mr.<name>John Smith</name>.
    Your order <orderid>1032</orderid>
    will be shipped on <shipdate>2001-07-13</shipdate>.
    </letter>
    

5. Schema语法规则 – simpleType 简单类型

规定与约束具有纯文本内容的元素(不含子元素)或属性的值,事实上schema中所有的内置类型都是simpleType

restriction 元素定义对 simpleType、simpleContent 或 complexContent元素可接受的值。
<xs:element name="level">
	<xs:simpleType>
		<xs:restriction base="xs:string">
			<xs:enumeration value="A"></xs:enumeration>
			<xs:enumeration value="B"></xs:enumeration>
			<xs:enumeration value="C"></xs:enumeration>
			<xs:enumeration value="D"></xs:enumeration>
		</xs:restriction>
	</xs:simpleType>
</xs:element>

6. simpleType数据类型的限定类型

限定 描述
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。

7. schema 指示器

  1. sequence 规定子元素必须按照特定的顺序出现
  2. choice 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼)
  3. All 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次
  4. maxOccurs 指示器可规定某个元素可出现的最大次数
  5. minOccurs 指示器可规定某个元素可出现的最小次数

如需使某个元素的出现次数不受限制,必须使用xs:sequence或xs:choice,并且使用 maxOccurs="unbounded" 这个声明

以上是关于XML学习的主要内容,如果未能解决你的问题,请参考以下文章

需要示例代码片段帮助

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”

创建片段而不从 java 代码实例化它

如何组合绑定片段而不将它们包装在 XML 文字中

我们可以在活动 xml 中编写 UI 以及在片段 xm 中编写 UI 吗?