XML 能干嘛
- 能存储数据
- 能作为配置文件使用
- 使用xml在网络中传递数据
XML 注释
- XML 中必须进行文档声明, version 版本信息, encoding 编码
- XML 文档声明必须卸载第一行
- xml 中的元素标签 命名规则 标签定义不能用空格或者冒号 xml标签名称区分大小写
- xml中有且只有一个根元素
- 允许空元素,空元素没有结束标签
- 属性是元素的一部分,只能出现在元素的初始标签,属性值必须使用单引号或者双引号 一个元素标签可以定义多个
XML 约束
- 编写一个文档来约束一个 XML文档的书写规范,成为XML约束
- 常见的xml 约束 DTD Schema
DTD 约束
DTD 文档类型定义,用来约束XML 文档,规定XML文档中元素的名称,子元素的名称和顺序,元素的属性等。
编写DTD
- 开发中我们不会自己编写DTD约束文档
- 我们可以通过框架提供的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
- 引入dtd文档到xml文档中,两种方式 内部dtd:将约束规则定义在xml文档中 外部dtd:将约束规则定义在外部dtd文件中 本地:<!DOCTYPE 根标签名 SYSTEM dtd文件的位置> 网络:<!DOCTYPE 根标签名 PUBLIC dtd文件名字 dtd文件的位置URL>
Schema 约束
- Schema 是新的XML 文档约束,比DTD强大很多
- Schema 也是 XML文档,但Schema文档的拓展名为xsd 不是xml
- Schema 功能更强大,内置多种简单和复杂的数据类型
- Schema 支持命名空间
XML解析方式
- DOM : 要求解析器将整个XML文档加载到内存,并解析成一个Document对象 优点:元素和元素之间保留结构关系,可以进行增删改查操作 缺点:XML 文档过大,可能出现内存溢出显现。
- 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 获取某个元素
- /AAA/DDD/BBB 表示一层一层 AAA>DDD>BBB
- //BBB 获取名称相同只要是BBB
- /* 所有元素
- BBB[1],BBB[last()] 第一个元素,最后一个元素
- //BBB[@id] BBB元素上面有id属性都能得到
- //BBB[@id='b1'] 表示 BBB属性id 为b1
API
selectSignleNode(query) 查找和XPath 查询匹配的一个节点,
selectNodes(query)满足xpath 所有节点