XML基础

Posted 司机刹一脚

tags:

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

1.xml概述

  XML全称为Extensible Markup Language,意思是可扩展的标记语言。

  XML的作用是存放数据,配置文件

2.xml的文件要求

  文档声明格式:

<?version="1.0" encoding="UTF-8"?>

文档声明必须为<?xml开头,以?>结尾

文档声明必须从文档的0行0列位置开始

文档声明只有两个属性

  version:指定xml文档版本,必须属性,因为我们不会选择1.1,只会选择1.0

  encoding:指定当前文档的编码,可选属性,常用值是UTF-8

3.xml的元素

  元素:element

元素是xml文档中最重要的组成部分

普通元素的结构开始标签,元素体,结束标签组成.

  <hello>你好</hello>

元素体可以是元素,也可以是文本

  <a><b>你好</b></a>

空元素只有开始标签,但元素必须自己闭合,<c/>

元素命名:区分大小写,不能使用空格,不能使用冒号,

必须只有一个跟元素

4.xml的属性

 属性:attribute

属性是元素的一部分,它必须出现在元素的开始标签中

属性的定义格式,属性名=属性值,其中属性值必须使用单引或双引

一个元素可以有n个属性,但一个元素不能出现同名属性

属性名不能使用空格,冒号等特殊字符,必须以字母开头

xml注释

xml的注释,<!-- -->

转义字符

 

 CDATA

 

<![CDATA[
            <bean id="xx" className="xx">
                <property name="xx" value="xx" >
                    1 &lt; 3  &gt;  &amp;  &quot;  &apos;
                </property>
            </bean>
        ]]>

5.xml的约束

  在xml中,可以编写一个文档来约束一个xml文档的书写规范,这称之为xml约束

 常见都有DTD,Schema

通过约束文档,可以编写出具有固定格式,规定格式的xml文档

6.DTD案例代码

DTD

<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT beans (bean*,import*) >

<!ELEMENT bean (property*)>

<!ELEMENT property (#PCDATA)>

 

<!ELEMENT import (#PCDATA)>

 

<!ATTLIST bean id ID #REQUIRED

               className CDATA #REQUIRED

               type CDATA #IMPLIED

 

<!ATTLIST property name CDATA #REQUIRED

                  value CDATA #REQUIRED

 

<!ATTLIST import resource CDATA #REQUIRED>



XML

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
    <bean id="b001" className="">
        <property name="" value=""></property>
        <property name="" value=""></property>
        <property name="" value=""></property>
        <property name="" value=""></property>
    </bean>
    <bean id="b002" className=""></bean>
    <bean id="b003" className=""></bean>
    <bean id="b004" className=""></bean>
    
    
    <import resource=""></import>
    <import resource=""></import>
    <import resource=""></import>
    <import resource=""></import>
</beans>

 

 

元素声明

 

7.Schema约束

Schema是新的XML文档约束;

Schema要比DTD强大很多,是DTD 替代者;

Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。

Schema 功能更强大,数据类型更完善

Schema 支持名称空间

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
    格式如下:
    <beans xmlns="http://www.itcast.cn/bean"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
    >
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.itcast.cn/bean"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://www.itcast.cn/bean" 
        elementFormDefault="qualified">
    <!-- 声明根标签 -->
    <element name="beans">
        <complexType>
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="required"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

Schema命名空间

  如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了

  总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突

 

 

声明命名空间

  

默认命名空间:<xxx xmlns=””> ,使用<标签>

显式命名空间:<xxx xmlns:别名=””> , 使用<别名:标签>

    1.一个xml文档中,只能出现一次“默认引用”

        <beans xmlns="名称"

    2.一个xml文档中,可以出现多次“显示引用”

        <beans xmlns:a="名称a"

               xmlns:b="名称b"

    3.所有引用(默认+显示),都必须确定xsd文档位置

        <beans xmlns="默认名称"

               xmlns:a="名称a"

               xmlns:b="名称b"

               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

               xsi:schemaLocation="默认名称   默认位置 

                                        名称a   a位置

                                        名称b   b位置"

Schema基本语法

 声明根标签

        1. <element> 声明元素(标签)

        2. 每一个元素必须确定类型:

            complexType 复杂类型

            simpleType 简单类型,一般不用,大部分都是复杂类型

        3. 需要继续明确子标签出差顺序

            <choice> 选择, ()

            <sequence> 顺序 ,

            <all> 任意

                minOccurs 最少出现次数

                maxOccurs 最大出现次数,unbounded 不限制(没有边)

        4.<attribute>用于给元素声明属性的

            use 设置属性使用, optional可选、required必选

  

<element name="beans">
        <complexType>
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="optional"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>

8.XML解析

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

a)     优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b)     缺点:XML文档过大,可能出现内存溢出显现。

  2.SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)

a)     优点:处理速度快,可以处理大文件

b)     缺点:只能读,逐行后将释放资源。

9.dom解析原理

  xml DOM将整个xml文档加载到内存,生成一个DOM树,并获得一个Document对象,通过document对象就可以进行DOM操作

  

  1. SaxReader对象

a)     read(…) 加载执行xml文档

  1. Document对象

a)     getRootElement() 获得根元素

  1. Element对象

a)     elements(…) 获得指定名称的所有子元素。可以不指定名称

b)     element(…) 获得指定名称第一个子元素。可以不指定名称

c)      getName() 获得当前元素的元素名

d)     attributeValue(…) 获得指定属性名的属性值

e)     elementText(…) 获得指定名称子元素的文本值

f)      getText() 获得当前元素的文本内容

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Dom4jDemo_01 {
    
    @Test
    public void demo01() throws DocumentException{
        
        //1 核心类
        SAXReader saxReader = new SAXReader();
        
        //2 获得Document(整个xml)
        Document document = saxReader.read("beans.xml");
        
        
        //3 获得根元素 beans
        Element rootElement = document.getRootElement();
        
        
        //4 所有子元素 bean
        List<Element> allBeanElement = rootElement.elements("bean");
        for (Element beanEle : allBeanElement) {
            //4.1 bean属性
            String id = beanEle.attributeValue("id");
            String className = beanEle.attributeValue("className");
            System.out.println("bean属性:" + id + " , " + className);
            
            //5 元素property
            List<Element> allPropElement = beanEle.elements("property");
            for (Element propEle : allPropElement) {
                String name = propEle.attributeValue("name");
                String value = propEle.attributeValue("value");
                System.out.println("property属性:" + name + " , " + value);
            }
            
            System.out.println("");
        }
    }
}

被解析的xml文档

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="beanId01" className="com.learn.domain.User">
        <property name="uid" value="u001"></property>
        <property name="username" value="jack"></property>
    </bean>
    
    <bean id="beanId02" className="com.learn.domain.Book">
        <property name="bid" value="b001"></property>
        <property name="title" value="标题"></property>
    </bean>

</beans>

 

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

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException

需要示例代码片段帮助

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

Android Fragments 基础知识:为啥?这在概念上是错误的吗?

SQL基础之XML

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