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.处理方式

⑴替代法

用其他字符替换歧义字符:

歧义字符 替换字符
< &lt;
> &gt;
& &amp;
' &apos;
" &quot;

⑵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():获取删除前后空格的内容。
posted @ 2017-05-27 22:04  tonghun  阅读(768)  评论(0编辑  收藏  举报