xml笔记2

xml文档
1、由于现代开发过程中,不需要开发人员手动解析XML文档,
    因此本课程主要内容是了解xml文档基本语法,以及xml约束文档的内容
2、xml编程语言:可扩展标记语言
    xml它里面的标签里面都是可扩展的
3、xml作用:
    主要用来存储数据。(xml和数据库各有各的好处,两者搭配才更好用)
    1.不同的系统之间传输数据。
    2.用来表示生活中有关系的数据。
    3.Java使用XML文档来代替properties作为配置文件。
6、xml的语法
    1.xml的文档声明
        创建一个文件,后缀名是“.xml”
        如果有文档声明,必须在第一行,第一列(作用声明这是个xml文件)
            <?xml version='1.0' encoding='utf-8' ?>
            设置保存的时候的编码和解析引擎打开时候的编码一致就不会乱码。
    2.定义元素(标签)
        * 必须要有结束标签
        * 标签内部没有内容可以在开始标签内部结束(<aaa />)
        * 一个标签中可以嵌套若干子标签,但所有标签必须合理嵌套不能交叉嵌套。
        * 一个xml中有且仅能有一个根标签。
        * 在xml中把空格和换行都当作内容来解析。
    3.定义属性
        和html的语法机构一样。
            <person id1="aaa"></person>
        1.一个标签上可以有多个属性
        2.一个标签上的多个属性名称不能相同
        3.属性名称和属性值之间使用“=”,属性值使用引号括起来(单引号、双引号都可以)
        4.属性的命名规范和元素名的命名规范相同。
    4.注释
        和html注释一样。
7、xml中标签的命名规则:
    1.区分大小写
    2.不能以数字和下划线(_)开头
    3.不能以xml(Xml、XML)这些开头,因为在xml中这些表示特殊的含义
    4.xml的标签名之间不能包含空格和冒号。
    5.可以使用字母、数字、下划线、中文汉字。

xml的约束
1、xml约束文档的分类
    1.DTD约束文档:简单约束文档
    2.schema约束文档:高级约束文档
2、dtd约束的快速入门
    创建一个文件  后缀名  .dtd
    第一步:
        看xml中有几个元素,有几个元素,在dtd文件中写几个:<!ELEMENT>
            <!ELEMENT> 用来定义元素
    第二步:
        判断元素是简单元素还是复杂元素?
            - 简单元素:没有子元素
            - 复杂元素:有子元素的元素
                <!ELEMENT 元素名称 (子元素名1[个数标识符],子元素名2[个数标识符],....)>  多个“子元素”之间使用逗号分隔
                    <!ELEMENT和元素名之间,元素名称和子元素列表的小括号之间必须有空格
                    个数标识符取值如下:和正则表达式中的个数标识符一样。
                        * 代表0~n个
                        + 代表1~n个
                        ? 代表0~1个
                        | 表示只能有一个子标签出现
                        不写代表有且仅有一个。
                示例:person.dtd约束文档
                    <!ELEMENT person (name,age)> <!--(name,age) 表示person标签有两个子标签,[个数标识符]没写代表name和age子元素有且仅有一个,name在age之前顺序不能乱-->
                    <!ELEMENT name (#PCDATA)> <!--(#PCDATA)表示是一个字符串-->
                    <!ELEMENT age (#PCDATA)>
    第三步:在xml文档中使用dtd约束
        使用dtd约束文件包括两种:
            内部的:将约束规则定义在xml文档中。
                语法结构:<!DOCTYPE 根标签的名字 [
                             写约束
                          ]>
            外部的:将约束规则定义在外部dtd文件中
                语法结构: <!DOCTYPE 根标签名 本地和远程 "dtd文件的位置">
                    本地和远程可选:
                        SYSTEM:本地的
                        PUBLIC:远程的
                    dtd文件的位置:
                        本地的可以是绝对路径也可以是相对路径
                        远程的一般是一个URL(http://.....)
                示例:person.xml文档
                    <?xml version="1.0" encoding="UTF-8" ?>
                    <!DOCTYPE person SYSTEM "D:\JavaCode\spring6\xml\src\main\resources\person.dtd">
                    <!--<!DOCTYPE person SYSTEM "person.dtd">这两种都可以-->
                    <person>
                        <name>薛英豪</name>
                        <age>23</age>
                    </person>
3、打开xml文件使用浏览器打开,浏览器只负责校验xml语法,不负责校验约束,
    哪怕xml文档写的不符合,dtd约束文档的规则,也可以在浏览器中运行,
    如果想校验xml的约束,需要使用工具(idea、myeclipse等)。
4、使用dtd定义元素
    “约束”可以是一下几种
        简单元素:没有子元素的元素
          <!ELEMENT 元素名 约束>
            * (#PCDATA):字符串类型【三种约束只有字符串需要加双引号和井号】
            * EMPTY : 元素为空,没有内容
            * ANY : 任意类型的内容
        复杂元素:
          <!ELEMENT 元素名 (子元素列表)>
            , :表示子标签的顺序,顺序出错,则报错
            | :表示只能有一个子标签出现
            ? :子标签只能出现零次或一次
            + :子标签能出现一次或多次
            * :子标签能出现零次或多次
            若不写,则标签只能出现一次
5、使用dtd约束方式定义属性
    语法:    <!ATTLIST 元素名称
                属性名称 属性类型 属性的约束
            >
        属性名称:见名知意就好
        属性类型:
            CDATA:表示属性取值为普通的文本字符串
            ENUMERATED:表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
                案例:
                    <!ATTLIST some  //some是元素的名称
                          id  (aa|bb)   // id是属性的名称 (aa|bb)是枚举的取值
                    >
            ID:表示属性的取值不能重复,属性的值只能由字母、下划线开始
        属性的约束:
            #REQUIRED:表示该属性必须出现
            #IMPLIED:表示该属性可有可无
            #FIXED:表示属性的取值为一个固定值,
                语法:#FIXED "固定值"
            直接值:表示属性的取值为该默认值
                <!ATTLIST some
                    id CDATA "A123546"  <!--如果some元素没有id属性,那么id的之默认是“A123456”,【与#FIXED不同】如果有id属性可以自定义成其他属性-->
                >
    示例:
        <!ATTLIST some   <!-- 给some标签添加属性 -->
              id ID  #REQUIRED   <!-- id是属性名称,ID是属性类型,#REQUIRED是属性约束 -->
        > 
    同时给一个标签的属性加两个约束:
        <!ATTLIST some
              id CDATA #FIXED "A123546"
        >
        <!ATTLIST some
            id CDATA #REQUIRED
        >
6、定义引用实体:
    概念:在dtd中定义,在xml中使用。
    语法:<!ENTITY 实体名称 "实体内容" >
        案例:<!ENTITY xyh "薛英豪在邢台学院">
        定义实体的时候一般都是写在xml内部的dtd文档当中
    引用方式:&实体名称;

解析xml文档的两种方式:
    第一种:DOM方式【主要用在服务器端】,一次性把整个document树加载进内存。
        优点:可以对xml进行任意的urud操作。
        缺点:浪费内存空间。
    第二种:SAX方式【主要用在移动端】,一行一行的读取
        优点:节省内存空间
        缺点:只能解析,不能对xml文档进行“增删该”
    在实际开发过程中:一般采用DOM方式来读取,用空间换时间

解析xml文件的解析器
    想要解析xml首先需要解析器
    不同的公司和组织提供了针对dom和sax方式的解析器,通过api的方式提供
    解析器就是别人写好的一堆class文件,我们直接那来运行就可以得到xml文件中的数据。
    我们自己也可以写一个解析器。
    sun公司提供了针对dom和sax的解析器  jaxp
    dom4j组织提供了针对dom和sax的解析器  dom4j(实际开发中用的最多的)
    jdom组织提供了针对dom和sax的解析器  jdom

解析xml
1、jaxp的api的查看
    jaxp是javase的一部分。
    jaxp解析器在jdk的javax.xml.parsers包里面
        四个类分别是针对dom和sax解析使用的类:
            dom
                DocumentBuilder:解析器类
                    DocumentBuilder是一个抽象类,不能new对象
                    此类实例可以从DocumentBuilderFactory类的实例调用
                    newDocumentBuilder()方法获得
                    常用方法:
                        1.Document parse(String uri)  将给定URI的内容解析为XML文档,并返回一个新的DOM Document对象。
                        2.Document parse(InputStream is)  将给定的InputStream的内容解析为XML文档,并返回一个新的DOM Document对象。
                        3.Document parse(File f)  将给定文件的内容解析为XML文档,并返回一个新的DOM Document对象。
                    Document是一个接口,父接口是Node    
                        【Document接口的常用方法】
                            1.NodeList getElementsByTagName(String tagname)  通过标签名获取所有标签
                            2.Element createElement(String tagName)  创建指定类型的元素。 
                            3.Text createTextNode(String data)  创建给定指定字符串的Text节点。
                        【Node中的常用方法】
                            1.Node appendChild(Node newChild)  将节点 newChild添加到此节点的子节点列表的末尾。
                            2.Node removeChild(Node oldChild)  通过删除指定的子节点 oldChild,并将其返回。
                            3.Node getParentNode()  获取这个节点的父节点。
                            4.String getTextContent() 此属性返回此节点及其后代的文本内容。 
                            5.void setTextContent(String textContent) 设置节点的内容,只是改变了在内存中的数据
                            
                        【NodeList中的常用方法】
                            1.int getLength()  获取列表中的节点数。
                            2.Node item(int index)  返回集合中的第index项。 
                DocumentBuilderFactory:解析器工厂
                    DocumentBuilderFactory是一个抽象类,不能new对象
                    DocumentBuilderFactory实例可以通过
                    DocumentBuilderFactory类的一个方法获得newInstance
            sax
                SAXParser:解析器类
                SAXParserFactory:解析器工厂
2、使用JAXP实现查询的操作
    // 获取DocumentBuilder实例
    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    // 获取xml的绝对路径
    String path = Thread.currentThread().getContextClassLoader().getResource("person.xml").getPath();
    // 将xml解析成一个dom对象
    Document document = documentBuilder.parse(path);
    // 通过标签的名字获取所有的“person”标签
    NodeList ns =  document.getElementsByTagName("person")
    for (int i = 0;i < ns.getLength();i++) {
        System.out.println(ns.item(i).getTextContent());
    }
3、使用JASP来增删改元素,操作的都是内存中的xml对象,
    如果想让xml源文件也发生改变,需要将内存中的数据“回写”到xml文件中。
    需要使用到:Transformer类
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    // document是内存中的dom文档对象,xml/target/classes/person.xml是xml文件的位置
    transformer.transform(new DOMSource(document),new StreamResult("xml/target/classes/person.xml"));

schema约束
0、xml schema也是一种用于定义和描述xml文档结构和内容的模式语言
    其出现是为了克服dtd的局限性。
1、对比dtd
    1.dtd的语法: <!ELEMENT 元素名称 约束>
    2.schema本身就是一个xml文档,schema里面写的就是xml语句
    3.dtd中里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
        比如 年龄 只能是整数,在schema中可以直接定义一个整数类型
    4.schema对名称空间支持的非常好。
    5.schema自定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
    6.schema语法更加复杂,schema目前还不能替代dtd
2、如果使用dtd约束,一个xml中只能引入一个dtd约束。
    如果使用schema约束,一个xml文档中可以引入多个schema约束。
        多个schema使用“名称空间”(或者叫做命名空间)来进行区分。
        在不同的命名空间中可以声明相同的名字。(名字相同用命名空间可以区分)
3、schema是用一套预先规定的XML元素和属性创建的,这些预先规定的属性和元素是W3C组织规定的。
4、schema的快速入门
    创建一个schema约束文件(后缀名是“.xsd”)
        根节点就是“<schema></schema>”
    第一步:看xml中有多少个元素,有多少个元素就写几个<element>
        <?xml version="1.0" encoding="UTF-8" ?>
        <person>
            <name>zhangsan</name>
            <age>23</age>
        </person>
    第二步:看是简单元素还是复杂元素[简单元素写在复杂元素里面]
        复杂元素:    
            <element name="person">  <!--声明元素,名叫person-->
                <complexType>    <!--复杂的-->
                    <sequence>  <!--按顺序-->
                        <element name="name" type="string"></element> <!--声明元素,名叫name-->
                        <element name="age" type="int"></element> <!--声明元素,名叫age-->
                    </sequence>
                </complexType>
            </element>
    第三步:引入约束文件
        <根标签 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://xyh.com/2023323" 【“http://xyh.com/2023323”是引入的约束的命名空间】
        xsi:schemaLocation="http://xyh.com/2023323 http://xyh.com/2023323/1.xsd">
5、应用schema约束开发xml过程
    W3C预先定义的元素和属性 --> schema文档(约束文档/模式文档) --> XML文档(实例文档)
    以spring框架为例:说明三部分的关系:
        “W3C预先定义的元素和属性”是编写schema约束文档的约束
        写spring框架的人使用“W3C预先定义的元素和属性”编写schema约束文档
        用户(我们/程序员)使用spring框架的时候需要根据“schema约束文档”编写XML文档
6、编写了一个XML Schema约束文档之后,通常需要把这个文件中声明的元素绑定到一个URI地址上,
    这个URI叫做namespace命名空间,以后XML文件就可以通过这个URI引用绑定指定定名空间的元素。
7、解释
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    其中xs是命名空间,schema是根节点名。
    注意xs:schema与xmlns:xs中的xs要完全一样(名称可以任意,只要一样就可以)
    它标明以xs:开头的节点元素是http://www.w3.org/2001/XMLSchema定义的元素。
    
    <xs:element name="hello" type="xs:string">
    上面已经说明,xs:element表示element是http://www.w3.org/2001/XMLSchema中定义的元素。
    它的name属性用来定义它所描述的XML文档中的节点名。
    type是表示该节点的值的类型。这里的xs:string(string类型)表示hello节点不能包含子节点,不能包含属性,它的内容值应该是string类型。
    
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            targetNamespace="http://com.xyh/xml" >
    </schema>
    在XSD文件中为定义的元素指定名称,即指定目标名称空间。这需要给<xsd:schema>元素添加targetNamespace属性。
    <xsd:schema targetNamespace="http://www.itcast.cn/xml">
    名称空间可以是任意字符串,但通常我们会使用公司的域名作为名称空间,这与Java中的包名使用域名的倒序是一样的!千万不要以为这个域名是真实的,它可以是不存在的域名。
    如果每个公司发布的Schema都随意指定名称空间,如a、b之类的,那么很可能会出现名称空间的名字冲突,所以还是使用域名比较安全,因为域名是唯一的。
    当使用了targetNamespace指定目标名称空间后,那么当前XSD文件中定义的元素和属性就在这个名称空间之中了。
8、xmlns="http://www.w3.org/2001/XMLSchema"  表示是约束文件
   xmlns="http://www.w3.org/2001/XMLSchema-instance"  表示被约束的文件(instance表示实例)
9、<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  //表示这个xml是被约束的文件,xsi是自定义的名称空间
            xmlns="http://com.xyh/2023322"    // 引入http://com.xyh/2023322命名空间
            xsi:schemaLocation="http://com.xyh/2023322 1.xsd">  // 指定约束文件的位置,http://com.xyh/2023322是命名空间 1.xsd(只有才同一个文件夹下才可以省略这么写)文件的位置【还可以写成:http://com.xyh/2023322/1.xsd】
        <name>zhangsan</name>
        <age>23</age>
    </person>
    不同的名称空间使用“别名”来区分。
10、<choice>  <!--元素只能出现其中一个-->
        <element name="name" type="string" maxOccurs="unbounded"></element> <!--声明元素,名叫name-->
        <element name="age" type="int"></element> <!--声明元素,名叫age-->
    </choice>
    maxOccurs="unbounded" :表示元素最多出现的次数(无限的)
    minOccurs="0" :表示该元素最少出现0次
11、schema中的:elementFormDefault="qualified"表示质量良好的
    命名空间有别名,必须都得加别名
12、在schema约束文档中属性的声明
    <attribute name="id" type="ID" use="required"></attribute>
    在某个元素下面定义属性,就必须在“某”个元素下面的“<complexType>”标签里面使用attribute标签来定义
13、spring约束头
    mybaits约束头
    javaweb约束头
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛英豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值