Day13-XML

XML的简介


XML:eXtensible Markup Language 可扩展标记语言 version=”1.0”

  • 可扩展:所有的标签都是自定义的。
  • 功能:数据存储
    • 配置文件(例如:c3p0的配置文件后缀就是xml )
    • 数据传输

html与xml区别:

  • html语法松散,xml语法严格
  • html做页面展示,xml做数据存储
  • html所有标签都是预先定义好的,xml所有标签都是自定义的

xml语法

文档声明:
- 必须写在xml文档的第一行第一列。
- 写法:<?xml version="1.0" ?>
- 属性:
- version:版本号 固定值 1.0
- encoding:指定文档的码表。默认值为 iso-8859-1
- standalone:指定文档是否独立 yes 或 no,允不允许别人来约束你

元素:xml文档中的标签

  • 文档中必须有且只能有一个根元素
  • 元素需要正确闭合。<student/> <name></name>
  • 元素需要正确嵌套
  • 元素名称要遵守:
    • 元素名称区分大小写
    • 数字不能开头

文本:转义部分
- 转义字符:<> 分别为@lt; @rt;其他的符号还有@等;
- CDATA: 里边的数据会原样显示:CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

- <![CDATA[ 数据内容 ]]>

属性:
- 属性值必须用引号引起来。单双引号都行

注释:
同HTML中的注释是一样的。

<!-- -->

xml约束:

定义:
约束就是xml的书写规则

约束的分类:

* dtd(约束力度不够,现在基本不使用):     
* schema;

dtd约束:约束力度不够,现在基本不使用了
这里写图片描述

schema:
约束力度足够,不仅可以约束标签,还能够约束标签内容。
这里写图片描述
文档类型为xsd;
schema约束文件结构解析:
整个xsd文件如下:

<?xml version="1.0"?>
<xsd:schema xmlns="url"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="url" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="itcast_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

结构解析:
1)名称空间:命名空间

xmlns:(xmlnamespace的简写),虽然可以随便写内容,但是一般写公司的url,其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。xmlns和targetNamespace的内容要一样。引用的时候就通过这个xmlns来引用
xmlns:xsd :实例名称空间,表示引用网络上的一个地址,这个地址是固定写法。
elementFormDefault为固定值,照着写就好了。

<xsd:schema xmlns="url"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="url" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>

引用xsd文件的时候:

<students
      xmlns="http://www.itcast.cn/xml"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>

xmlns:就是xsd文件中的xmlns
xmlns:xsi:网络地址,固定值
xsi:先写xmlns地址,再写文件名字

2)
表示标签名约束标签名为students的约束。用studentsType的约束内容来约束;
complexType表示标签students下面可以有子标签;
sequence:表示序列,就是说上层标签students中可以有一个下面的子标签,在本利中是可以有子标签student和teacher。序列会有一定的顺序的,不能够擅自改变顺序。
minOccurs和MaxOccurrs分别表示这个标签的最小数量和最大数量。

 <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
            <xsd:element name="teacher" />
        </xsd:sequence>
    </xsd:complexType>

3)simpleType:简单类型,表明被约束的标签不能够有子标签
base :表示标签中标签体的数据类型。
enumeration:枚举类型

    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>

XML解析(重点)

解析xml的目的

  • 读取xml中的数据
  • 往xml中写入数据(几乎用不到),数据传入一般用json来传输

xml的解析思路(了解)
DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。

  • 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
  • 缺点:dom树非常占内存,解析速度慢。

SAX:逐行读取,基于事件驱动(里面有个读取器,边读边触发事件)

  • 优点:不占内存,速度快
  • 缺点:只能读取,不能回写,而且程序员使用不方便

常用的xml解析器

JAXP:sun公司提供的解析。支持dom和sax。(不常用)
JDOM(后来分裂了)
DOM4J(document for java 民间方式,但是是事实方式。非常好。 支持dom)


DOM4J解析xml

步骤:

  • 1.导入jar包 dom4j.jar(遇到框架就导包)
  • 2.创建解析器
    SAXReader reader = new SAXReader();
  • 3.解析xml 获得document对象
    Document document = reader.read(url);
    获取根节点Element root = documen.getRootElement()
    -4.通过document对象的getRootElement方法找到根标签
    Element rootElement = document.getRootElement();

然后可以通过两种方式找到根标签下面的子标签:
1)迭代器方法:elementIterator();
getName();获取标签名
getText();获取标签体内容

      public void test01() throws Exception{
           SAXReader reader = new SAXReader();
           Document document = reader.read("src/com……/Book.xml");
           Element rootElement = document.getRootElement();
           //使用迭代器
//         System.out.println(rootElement.getName());;
           Iterator elementIterator = rootElement.elementIterator();
           while(elementIterator.hasNext()){
                 Element element =(Element) elementIterator.next();
                 Iterator elementIterator2 = element.elementIterator();
                 while (elementIterator2.hasNext()) {
                      Element element2 = (Element) elementIterator2.next();
                      System.out.print(element2.getName()+":");
                      System.out.println(element2.getText());
                 }
                 System.out.println();
           }
      }

2)使用element和elements方法解析:
rootElement.elements();返回该标签下的所有子标签,返回值是一个list
rootElement.element(“标签名”);获取标签下指定的标签元素的第一个Element。

      @Test
      public void test02() throws Exception{
           SAXReader saxReader = new SAXReader();
           Document document = saxReader.read("src/com/……/Book.xml");
           Element rootElement = document.getRootElement();

           List<Element> elements = rootElement.elements();
           for (Element element : elements) {
                 System.out.println(element.getName());
                 List<Element> elements2 = element.elements();
                 for (Element element2 : elements2) {
                       System.out.println(element2.getName()+":"+element2.getText());
                 }
                 System.out.println();
           }
      }

3)获取属性
标签名.attribute(“属性名”);返回的是一个Attribute的属性对象
再通过Attribute.getValue()方法获得这个属性的属性值
Attribute.getDat();也能够获取到属性的属性值。

    @Test
    public void test03() throws Exception{
        SAXReader saxReader = new SAXReader();//获取saxReader解析器
        Document document = saxReader.read("src/com/…/Book.xml");//读取xml文件,如src/com/itheima/xml/Book.xml
        Element rootElement = document.getRootElement();//获得根标签
        Element element = rootElement.element("书");
        Attribute attribute = element.attribute("出版社");
        System.out.println(attribute.getValue());;
    }

XPATH(属于DOM4J中的,用于查询特定的节点)
导的包有两个,一个DOM4J的包,另外一个是Xpath的包jaxen-1.1-beta-6.jar

1)创建saxReader解析器
saxReader saxReader = new SaxReader();
2)读取xml文件,read方法
3)获取根标签。getRootElement();

  • 使用的方法:
    • selectSingleNode():
    • selectNodes():
      步骤:
  • 1、注意:要导包 jaxen…jar
  • 2、创建解析器
    SAXReader reader = new SAXReader();
  • 3、解析xml 获得document对象
    Document document = reader.read(url);

1)获取符合路径的所有标签

SelectNodes("标签名或者标签层级");返回的是一个list
      @Test
      public void test04() throws Exception{
           SAXReader saxReader = new SAXReader();//获取saxReader解析器
           Document document = saxReader.read("src/com/……/Book.xml");//读取xml文件,如src/com/itheima/xml/Book.xml
           Element rootElement = document.getRootElement();//获得根标签
           List<Element> selectNodes = rootElement.selectNodes("书/书名");
           for (Element element : selectNodes) {
                 System.out.println(element.getName()+":"+element.getText());
                 System.out.println();
           }
      }

2)selectSingleNode()获取单个节点标签
获取符合条件的第一个标签的相关内容。
要查看路径怎么写的,可以去资料中的index中看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值