XML


XML 能干嘛

  1. 能存储数据
  2. 能作为配置文件使用
  3. 使用xml在网络中传递数据

XML 注释

  1. XML 中必须进行文档声明, version 版本信息, encoding 编码
  2. XML 文档声明必须卸载第一行
  3. xml 中的元素标签 命名规则 标签定义不能用空格或者冒号 xml标签名称区分大小写
  4. xml中有且只有一个根元素
  5. 允许空元素,空元素没有结束标签
  6. 属性是元素的一部分,只能出现在元素的初始标签,属性值必须使用单引号或者双引号 一个元素标签可以定义多个

XML 约束

  1. 编写一个文档来约束一个 XML文档的书写规范,成为XML约束
  2. 常见的xml 约束 DTD Schema

DTD 约束

DTD 文档类型定义,用来约束XML 文档,规定XML文档中元素的名称,子元素的名称和顺序,元素的属性等。

编写DTD

  1. 开发中我们不会自己编写DTD约束文档
  2. 我们可以通过框架提供的DTD约束文档,编写对应的XML文档,常见的框架使用DTD约束有:struts2, hibernate等

    <!ELEMENT students (student+) > // students代表根元素 student+ 跟标签,至少有个student 子元素 <!ELEMENT student (name,age,sex)> //可以包含子元素,按顺序出现 <!ELEMENT name (#PCDATA)> // 普通的文本内容 <!ELEMENT age(#PCDATA)> <!ELEMENT sex(#PCDATA)> <!ATTLIST student number ID #REQUIRED> //用来定义属性 ID #Required :number 的属性必须填写,ID 唯一的值,不能重复,值只能是字母或者下划线开头

引入DTD

  1. 引入dtd文档到xml文档中,两种方式 内部dtd:将约束规则定义在xml文档中 外部dtd:将约束规则定义在外部dtd文件中 本地:<!DOCTYPE 根标签名 SYSTEM dtd文件的位置> 网络:<!DOCTYPE 根标签名 PUBLIC dtd文件名字 dtd文件的位置URL>

Schema 约束

  1. Schema 是新的XML 文档约束,比DTD强大很多
  2. Schema 也是 XML文档,但Schema文档的拓展名为xsd 不是xml
  3. Schema 功能更强大,内置多种简单和复杂的数据类型
  4. Schema 支持命名空间

XML解析方式

  1. DOM : 要求解析器将整个XML文档加载到内存,并解析成一个Document对象 优点:元素和元素之间保留结构关系,可以进行增删改查操作 缺点:XML 文档过大,可能出现内存溢出显现。
  2. SAX: 速度更快,更有效,逐行扫描文档,边扫描边解析,以事件驱动方式具体解析,每执行一行,触发对应的时间 优点: 占用内存少,处理速度快,可以处理大文件 缺点: 只能读,逐行后将释放资源

XML 常见的解析器

解析器:根据不同的解析方式提供具体实现 JXAP: sun公司,支持DOM和SAX DOM4J: 易用开源,支持 XML,XPath 和XSLT,用于Java平台,支持 DOM SAX JAXP Jsoup :java HTML 解析器 可以解析XML PULL: android 内置 XML解析方式,类似SAX

dom4j使用

使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素, 1.SaxReader对象 read(...)加载执行xml文档 2.Document对象 getRootElement()获得根元素 3.Element对象 elements(...)获得指定名称的所有子元素,可以不指定名称 element(...)获得指定名称的第一个子元素,可以不指定名称 getName()获取当前元素的元素名 attributeValue(...)获取指定属性名的属性值 elementText(...)获取指定名称子元素的文本值

基本流程

    SAXReader reader = new SAXReader();
    Document document  = reader.read(path);
    Element root = document.getRootElement();
    root.getName();
    List<Element> elements  = rootElement.elements();

xpath

xpath查找XML内容,好处在于dom4j在解析xml 只能一层一层解析,当文件层数过多使用不方便,可以使用xpathhu 获取某个元素

  1. /AAA/DDD/BBB 表示一层一层 AAA>DDD>BBB
  2. //BBB 获取名称相同只要是BBB
  3. /* 所有元素
  4. BBB[1],BBB[last()] 第一个元素,最后一个元素
  5. //BBB[@id] BBB元素上面有id属性都能得到
  6. //BBB[@id='b1'] 表示 BBB属性id 为b1

API

selectSignleNode(query) 查找和XPath 查询匹配的一个节点,
selectNodes(query)满足xpath 所有节点