XML——基本语法及使用规则

目录

1、XML简介 

1.1、什么是XML?

1.2、XML和HTML之间的区别?

1.3、XML的作用

1.4、XML自定义标签

2、XML的语法结构

2.1、XML命名规则

2.2、XML声明

2.3、XML元素

2.4、XML注释

2.5、XML属性

2.6、CDATA区

3、XML约束

3.1、DTD约束

3.2、DTD约束抽取

3.3、DTD的属性

3.4、Schema约束

4、数据解析及常见解析XML方式

4.1、DOM方式

4.2、SAX方式

4.3、JDOM方式

4.4、DOM4J


1、XML简介 

1.1、什么是XML?

XML 指可扩展标记语言(EXtensible Markup Language)。

XML 是一种很像HTML的标记语言。

XML 的设计宗旨是传输数据,而不是显示数据。

XML 标签没有被预定义。您需要自行定义标签。

XML 被设计为具有自我描述性。

XML 是 W3C 的推荐标准。

1.2、XML和HTML之间的区别?

XML不是HTML的替代,XML被设计是用来传输和存储数据的,其重点是数据的内容。

而HTML被设计是用来显示数据的,其重点是数据的外观样式。 

XML 是独立于软件和硬件的信息传输工具 

1.3、XML的作用

通常会把xml当作一个配置文件去使用。(在Spring Struts Hibernate Springmvc Mybatis等框架中作为配置文件)。

1.4、XML自定义标签

标签没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由 XML 文档的创作者发明的。XML 语言没有预定义的标签。HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> 等等)。XML 允许创作者定义自己的标签和自己的文档结构。

2、XML的语法结构

2.1、XML命名规则

XML 元素必须遵循以下命名规则:

1、名称可以包含字母、数字以及其他的字符。

2、名称不能以数字或者标点符号开始。

3、名称不能以字母 xml(或者 XML、Xml 等等)开始。

4、名称不能包含空格。

5、可使用任何名称,没有保留的字词。

最佳命名习惯

使名称具有描述性。使用下划线的名称也很不错:<first_name>、<last_name>。

名称应简短和简单,比如:<book_title>,而不是:<the_title_of_the_book>。

避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为您想要从 first 里边减去 name。

避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。

避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。

XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的命名规则来命名 XML 文档中的元素。

在 XML 中,éòá 等非英语字母是完全合法的,不过需要留意,您的软件供应商不支持这些字符时可能出现的问题。

2.2、XML声明

XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:

<!--声明xml文件,设置xml文件的编码,版本的信息-->
<?xml version="1.0" encoding="utf-8"?>

2.3、XML元素

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

写法:<标签名> 
在xml中,同样的去区分单标签和双标签
单标签 :<标签名 />
双标签:<标签名> 内容(文本,其他标签) </标签名>

标签名是我们自己定义的。建议大家。采用标识符的命名规则去给一个标签起名字。(数字字母下划线,并且数字不能作为开头)

案例:
描述 书籍的信息。书名字,作者,单价。


标签的书写注意事项:
1、xml中的所有标签必须闭合。
2、xml中的标签名称严格区分大小写。<User>  <user>
3、在xml标签名中间不要书写空格,或者 冒号   逗号 等符号。
	标签的名字不要有空格一类特殊符号。
4、标签名不要以数字开始。(可以按照标识符的方式给标签去命名)

5、书写xml标签时  ,标签不能互相嵌套。
<age>23<name>zhangsan></age></name>
6、所有的xml文件只能有一个根标签。

7、我们可以通过浏览器来校验xml文件的格式是否正确。
<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <name>三国演义</name>
        <author>罗贯中</author>
        <price>39.9</price>
        <version>1.0</version>
    </book>
</books>

2.4、XML注释

xml中的注释和html中的注释的写法是一样的。

<!-- 内容--> -------本身就是多行注释了。

注意:注释的内容,会在浏览器中显示出来。

书写注释的时候,内容尽可能的去避免 -- 字符

<!--
    1、每一个xml,有且只有一个根标签,所有xml标签必须写在根标签中
    2、标签必须要有合闭
    3、xml格式是否正确,可以通过浏览器打开xml。来校验xml格式是否正确
    4、xml是区别大小写的
    5、xml书写标签名时,不要出现空格等特殊字符
    6、标签命名时不要以数字开头
    7、在书写标签中时不要乱嵌套或相互嵌套  <name><age></name></age>
-->

2.5、XML属性

属性:书写在标签内的。对标签的数据进行扩展。对标签的进一步描述。

写法:<标签名 属性名=“属性值” 属性名=“属性值”> </标签名> 属性名也是自定义的。

注意问题:

1、如果是双标签,属性要书写在开始标签内

2、属性名不要出现空格,“;”“:” 特殊字符不要出现。

3、属性值必须用单引号,或者双引号包围起来。

2.6、CDATA区

CDATA区:可以输出特殊字符:原样的显示书写在CDATA的内容。会原封不动的显示出去。

我们可以使用预定义的实体,去替代一些特殊字符的输出。

注意实体的写法:&实体的名字;

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos ; ' 单引
&quot ; "" 双引
<books>
    <book>
        <name>西游记</name>
        <!--
          为author添加扩展信息, 如:name , age 等
           1、多个属性之间用空间分隔
           2、属性要书写在开始标签内
           3、在xml中属性一定要用双引或单引,引起来
           4、属性名要按命名规则来
      -->
        <author sex="男" address="郑州">&lt;吴承恩&gt;</author>
        <pirce>50</pirce>
        <version>1.2</version>
    </book>
</books>

3、XML约束

什么是XML约束:对xml中的内容进行限制哪些怎么写有一定的约束限制,其实后面我都都是把xml作为配置文件来使用,所以我必须得看的懂xml中约束。

DTD目的: 可以看懂DTD文件,基于这个DTD文件可以写一个符合约束的xml文件。

XML约束分为两种: DTD约束、 Schema约束。

3.1、DTD约束

元素定义

语法 关键字 作用 示例
<!ELEMENT 节点名称 (#PCDATA)> #PCDATA 代表文本元素,里面的内容必须是文本 <!ELEMENT name (#PCDATA)>
<!ELEMENT 节点名称 EMPTY> EMPTY 不能包含任何子元素和文本,仅可以使用属性 <!ELEMENT version EMPTY>
<!ELEMENT 节点名称 (e1,e2)> (e1,e2) 代表混合元素,表示这个标签里面还有其他的节点 <!ELEMENT person (name,age,contact,br*)>

元素的限制

限制 格式
元素可以出现的次数 0或1:?          0~N:*         1~N:+

这个的元素次数指的是:例如下面案例books根目录下book这个标签能够出现的次数。 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books [
        <!--定义根标签books-->
        <!ELEMENT books (book*)>
        <!--定义book标签中的子类标签-->
        <!ELEMENT book (name,author,price,version)>
        <!--子类标签name,其特性为#PCDATA,文本内容-->
        <!ELEMENT name (#PCDATA)>
        <!--子类标签author作者-->
        <!ELEMENT author (#PCDATA)>
        <!--子类标签 price价格-->
        <!ELEMENT price (#PCDATA)>
        <!--版本 这里特性为空值-->
        <!ELEMENT version EMPTY>
        ]>
<books>
    <!--因为book是*,所以可以0次,可以多次-->
    <book>
        <name></name>
        <author></author>
        <price></price>
        <version/>
    </book>
</books>

当在xml文件中加入<!DOCTYPE>约束后,输入标签<books>时会自动导入其子类标签。

3.2、DTD约束抽取

把DTD约束写到一个xml文件中有个弊端,就是只能这一个文件能够使用,为了方便以后多个文件可以共有这个DTD约束,我们需要把约束写到单独的一个.dtd文件中。

book.dtd文件

<!--定义根标签books-->
        <!ELEMENT books (book*)>
        <!--定义book标签中的属性标签-->
        <!ELEMENT book (name,author,price,version)>
        <!--属性标签name,其特性为#PCDATA,文本内容-->
        <!ELEMENT name (#PCDATA)>
        <!--属性标签author作者-->
        <!ELEMENT author (#PCDATA)>
        <!--属性标签 price价格-->
        <!ELEMENT price (#PCDATA)>
        <!--版本 这里特性为空值-->
        <!ELEMENT version EMPTY>

books.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--引入外部DTD文件-->
<!DOCTYPE books SYSTEM "book.dtd">
<books>
    <book>
        <name>西游记</name>
        <author>吴承恩</author>
        <price>29.9</price>
        <version/>
    </book>
    <book>
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>39.9</price>
        <version/>
    </book>
</books>

3.3、DTD的属性

定义标签中的属性
attribute  list ,可以定义多个属性,为一个标签定义多个属性。
标签名:属性属于那个标签的。
<!ATTLIST 标签名 
                属性名 属性的类型(CDATA  (EN1|EN2)   ) 属性的约束(REQUIRED)

为了便于阅读。把多个属性进行换行。
                属性名 属性的类型 属性的约束
                属性名 属性的类型 属性的约束

解释
CDATA 表示文本
#REQUIRED 属性是必须的
#IMPLIED 属性非必须的
#FIXED 属性为固定字符串值

 book.dtd文件

<!--定义根标签books-->
        <!ELEMENT books (book*)>
        <!--定义book标签中的属性标签-->
        <!ELEMENT book (name,author,price,version)>
        <!--属性标签name,其特性为#PCDATA,文本内容-->
        <!ELEMENT name (#PCDATA)>
        <!--属性标签author作者-->
        <!ELEMENT author (#PCDATA)>
        <!--属性标签 price价格-->
        <!ELEMENT price (#PCDATA)>
        <!--版本 这里特性为空值-->
        <!ELEMENT version EMPTY>

        <!--name属性是必须的-->
        <!--age属性是必须的-->
        <!--sex属性不是必须的-->
        <!--sco的值是固定100-->
<!ATTLIST author
                name CDATA #REQUIRED
                age  CDATA #REQUIRED
                sex  CDATA #IMPLIED
                sco  CDATA #FIXED "100"

book.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--引入外部DTD文件-->
<!DOCTYPE books SYSTEM "book.dtd">
<books>
    <book>
        <name>西游记</name>
        <author name="吴承恩" age="48" sex="男" sco="100">吴承恩</author>
        <price>29.9</price>
        <version/>
    </book>
    <book>
        <name>水浒传</name>
        <author name="施耐庵" age="58" sex="男" sco="100">施耐庵</author>
        <price>39.9</price>
        <version/>
    </book>
</books>

3.4、Schema约束

1、XML Schema是基于 XML 的 DTD 替代者。

2、XML Schema 符合XML语法结构,并且是可扩展的,后缀名为.xsd(xml schema document)。

3、XML Schema更容易地描述允许的文档内容,以及约束定义, 并支持名称空间。

配置xsd文件 

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.example.org/bookSchema"
           targetNamespace="http://www.example.org/bookSchema"
           elementFormDefault="qualified">
    <!--
        xmlns:xs="http://www.w3.org/2001/XMLSchema"  约束XML里使用xs:作前缀的元素、属性、类型等名称的变量是属于
        xmlns="http://www.example.org/bookSchema" 表示默认的命名空间是,也就是指定未使用任何前缀的元素、数据的命名空间为它.
        targetNamespace="http://www.example.org/bookSchema" 显示被此 schema 定义的元素来自命名空间
        elementFormDefault="qualified"  所有全局元素的子元素将被以缺省方式放到无名命名空间
    -->
    <xs:element name='books'>
        <xs:complexType>
            <!-- minOccurs/maxOccurs:指定元素出现的次数-->
            <!-- minOccurs:限制最小出现次数,0表示不限制 -->
            <!-- maxOccurs:限制最大出现次数,unbounded表示无限制 -->
            <xs:sequence maxOccurs='unbounded '>
                <xs:element name='book'>
                    <xs:complexType>
                        <xs:sequence>
                            <!--定义name标签-->
                            <xs:element name='name' type="xs:string"/>
                            <!--定义author标签-->
                            <xs:element name="author" >
                                <!--定义author标签的属性-->
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:string">
                                            <xs:attribute name="name" type="xs:string"/>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                            <!--定义price标签-->
                            <xs:element name='price' type="xs:double"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

引入xsd文件 

<?xml version="1.0" encoding="UTF-8" ?>
<books xmlns="http://www.example.org/bookSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.example.org/bookSchema book.xsd">
    <book>
        <name>红楼梦</name>
        <author>曹雪芹</author>
        <price>29.9</price>
    </book>
    <book>
        <name>三国演义</name>
        <author>罗贯中</author>
        <price>39.9</price>
    </book>
</books>

4、数据解析及常见解析XML方式

4.1、DOM方式

DOM(Document Object Model). 是用与平台和语言无关的方式表示XML文档的官方W3C标准,将标记语言文档一次性加载进内存,在内存中形成一颗dom树。

优点

操作方便,可以对文档进行CRUD的所有操作

缺点

通常需要加载整个XML文档来构造层次结构,消耗资源大。

4.2、SAX方式

SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。逐行读取,基于事件驱动的。

什么是事件驱动:一种基于回调机制的程序运行方法。由外至内一层一层解析。

优点

①不需要等待所有数据都被处理,分析就能立即开始。 ②只在读取数据时检查数据,不需要保存在内存中。 ③可以在某个条件得到满足时停止解析,不必解析整个文档。 ④效率和性能较高,能解析大于系统内存的文档。

缺点

只能读取,不能增删改

很难同时访问同一文档的不同部分数据,不支持XPath

4.3、JDOM方式

JDOM(Java-based Document Object Model)的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。

优点

①使用具体类而不是接口,简化了DOM的API。 ②大量使用了Java集合类,方便了Java开发人员。

缺点

①没有较好的灵活性。 ②性能较差。 

4.4、DOM4J

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。性能优异功能强大简单易用开放源代码。  

优点

①大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。 ②支持XPath。 ③有很好的性能。

缺点

大量使用了接口,API较为复杂

接下来我就演示一下使用DOM4J读取一下xml文件里的内容输出到控制台。

首先我们需要在目录下创建一个lib包,把下面的链接地址中的jar包放到lib包内,并手动添加到模块。

 

DOM4J的jar包链接如下:

链接:https://pan.baidu.com/s/1gwt_vNjALoae1ZsfKh-t_Q?pwd=6ly7 
提取码:6ly7 

Book.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book id="1">
        <name>西游记</name>
        <author>吴承恩</author>
        <price>29.9</price>
        <version/>
    </book>
    <book id="2">
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>39.9</price>
        <version/>
    </book>
</books>

测试类

public class DOMTest {
    public static void main(String[] args) throws DocumentException {
        SAXReader reader=new SAXReader();
        Document document = reader.read("Book.xml");
        //获取根目录元素对象
        Element dom = document.getRootElement();
        //获取所有根目录下的子节点
        List<Element> elements = dom.elements();
        for (Element element : elements) {
            //输出子节点的属性id值
            System.out.println(element.attributeValue("id"));
            //输出name值
            System.out.println(element.elementText("name"));
            //输出author值
            System.out.println(element.elementText("author"));
            //输出price值
            System.out.println(element.elementText("price"));
            System.out.println("----------------");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/select_myname/article/details/126262534#comments_26978724