XML
一概述
1.什么是XML?
eXtensible Markup Language,不以预先定义的一组数据结构为前提,用作应用程序间数据交换的载体。XML没有规定固定的标签与固定的结构,用户可以自定义,可扩展性强,这一点不同于HTML语言,HTML规定了可使用的标签以及标签之间的关系,扩展性差。
2.XML的作用
使用XML语言编写的文档主要用作应用程序间数据交换的载体,一个应用程序将传递给另一个应用程序的数据以XML语言编写,接收一方的应用程序根据XML语言的规则读取。
3.XML文档的构成
⑴序言
XML声明、处理指令与注释。
⑵文档元素
- 文档元素一般指文档标签。
- XML文档元素以树形分层结构排列。
- XML文档中只能有一个顶层元素,这个顶层元素叫做根元素。
- 文档元素必须有起始标记与结束标记,两种形式:<tagName>xxxxx</tagName与<tagName xxxx/>。
⑶元素属性
元素属性依附于元素,必须通过元素调用,只能出现在起始标签中,其值用单引号或者双引号括起来。
⑷元素注释
注释格式:<!--xxxx-->
4.dom4j
一种流行的读写XML文档的开源组件,导入架包就可使用。
二 特殊字符的处理
1.处理原因
一些字符是标签的一部分,当出现在元素内容中时会被XML文档解析器视作标签而不是普通字符,这是就会出错误,为了避免这种情况的出现,使用一些特殊方式来处理这些歧义字符。
2.处理方式
⑴替代法
用其他字符替换歧义字符:
歧义字符 | 替换字符 |
< | < |
> | > |
& | & |
' | ' |
" | " |
⑵CDATA字段
- 一种标记法,在可能出现歧义的字符前放一个标记,当系统接触到标记,就按照预先定义的处理方式把标记中的字符当做普通字符。
- 语法格式:<![CDATA[content]]>。
- 在XML中使用正则表达式必须使用CDATA字段。
三 几个重要类
1.继承关系
2.XMLWriter
用来将创建的XML文档输出到文档中,一个装饰类,装饰了Writer或者OutputStream。
- 如果装饰了字符流,为了防止输出到文档中的中文出现乱码,编码方式必须设为GBK。
- 如果装饰了字节流,为了防止输出到文档中的中文出现乱码,编码方式必须可设为UTF-8。
3.SAXReader
XML文档对象创建类,基于硬盘上的文档创建封装了文档全部信息的对象。
四 创建XML文档
1.创建XML文档首先应该创建文档对象
Document document=DocumentHelper.createDocument();
2.创建根节点
使用文档对象创建的节点即为根节点:
Element root=document.addElement(name);
3.创建子节点:
Element child=root.addElement(name);
4.向节点中添加内容
- element.setText(content):添加普通内容。
- element.addCDATA(content):添加CDATA字段。
5.添加或修改属性:
element.addAttibute(String name,String value);
6.添加注释:
element.addComment(commment);
7.设置编码格式:
OutputFormat format=new OutputFormat(); format.setEncoding(xxxx);
8.设置输出格式:
默认情况下,XML文档采用紧凑方式排版,阅读不方便,可以将输出格式改为缩进方式:
OutputFormat format=OutputFormat.creatPrettyPrint();
9.输出XML文档:
⑴未设置输出样式时输出:
File file=new File(path);//创建文件对象 XMLWriter writer=new XMLWriter(file); writer.close();
⑵设置了输出样式时输出:
XMLWriter writer=new XMLWriter(file,format);
⑶输出到页面:
PrintWriter out=response.getWriter(); XMLWriter writer=new XMLWriter(out,format);
⑷输出到控制台:
XMLWriter writer=new XMLWriter(System.out,format);
五 解析文档
1.解析XML文档的方式:
DOM4J:一次性将文件读取到内存,读取速度快,用于读取较小的文件,不适宜读取较大的文件。
SAX:边读边解析,适用于读取较大的文件。
2.子节点
子节点指定的是一级目录下的节点,不包括二级目录及以下目录中的节点。
3.解析文档的第一步是创建文档对象:
File file =new File(path); SAXReader reader=new SAXReader(); reader.read(file);
4.获取根节点:
Element root=document.getRootElement();
5.根据名称获取节点:
- root.element(name):获取具有指定名称的节点,如果文档中包含多个,则返回第一个。
- root.elements(name):以List集合返回具有指定名称的全部节点。
6.XPath:
XPath是一种根据路径获取xml文档节点的语言。
基本语法格式:selectNodes(String xpath)/selectSingleNode(String xpath)。
xpath有多种形式:
⑴根据名称获取节点:
- nodeName:获取具有指定名称的全部子节点。
- /root/xxxx:以相对于根节点的路径获取节点。
- xxxx/xxxx:以相对于操作对象的路径获取节点。
- //nodeName:不受路径限制,获取文档中指定名称的全部节点。
- A//nodeName:获取A节点下具有指定名称的全部后代节点。
⑵根据索引获取节点:
- A/nodeName[1]:获取子节中的第一个节点。
- A/nodeName[last()]:获取子节点中最后一个节点。
⑶根据属性获取节点:
- //nodeName[@attr]:不受路径限制,获取文档中具有指定名称与指定属性的全部节点。
- //nodeName[@attr=‘xxx’]:不受路径限制,获取文档中具有指定名称与指定属性值的全部节点。
- //nodeName[@attr+关系运算符xxxxx]:不受路径限制,获取文档中具有指定名称、同时满足关系运算的全部节点。
7.遍历节点
首先获取迭代器Iterator,该迭代器包含了具有指定名称的全部子节点:
Iterator<Element> it = root.elementIterator("book");
8.删除节点:
- parentNode.remove(subNode):由父节点删除。
- element.detach():自己删除自己。
- parentNode.elements(name).clear():删除具有指定名称的全部节点。
9.修改节点:
element.setName("newName"),修改节点名称。
10.获取属性:
- Attribute attr=element.attribute(String name):获取指定名称的属性。
- Attribute attr=element.attribute(int index):获取指定索引的属性,index从0开始。
- String value=attr.getValue():获取属性值。
- String value=element.attributeValue(name):直接根据属性名获取属性值。
- List<Node> attributes = doc.selectNodes("//@count"):不受路径限制,获取文档中具有指定名称的全部属性。
11.删除属性:
- attr.detach():自己删除自己。
- element.remove(attr):通过节点删除属性。
12.获取内容:
节点的内容指的是起始标签之间未被其他标签包含的文本,包含空格,所以才有了去除空格的方法getTextTrim。
- element.getText():获取内容,未删除前后可能存在的空格。
- element.getTextTrim():获取删除前后空格的内容。