XML文档结构
一个XML文档结构由根元素、元素、元素属性、文本组成,引用w3school上的一张图和说明:
上图表示下面的 XML 中的一本书:
<?xml vesion=”1.0” standalone=”yes” encoding=”utf-8”> ---- XML声明
---- 根元素
---- 为元素、元素属性 category、文本 Harry Potter,包括
4个子元素:title、author、year、price
Harry Potter ----- 为元素、Harry Potter为文本内容J K. Rowling
2005
29.99
Learning XMLErik T. Ray
2003
39.95
Everyday ItalianGiada De Laurentiis
2005
30.00
1. XML声明:是一个XML处理指令,其中version、standalone、encoding是三个特性
•version: 说明这个文档符合1.0规范
•standalone: 说明文档在这一个文件里还是需要从外部导入, standalone 的值设为yes 说明所有的文档都在这一文件里完成
•encoding: 指文档字符编码
2. XML根元素:必须有一个根元素。
根元素的起始标记要放在所有其它元素起始标记之前,根元素的结束标记根放在其它所有元素的结束标记之后。
3. XML元素
•元素标记区分大小写, 与 是两个不同的标记
•结束标记必须有反斜杠,如
XML元素标记命名规则如下:
•名字中可以包含字母,数字及其它字母
•名字不能以数字或下划线开头
•名字不能用xml开头
•名字中不能包含空格和冒号
4. XML注释
•注释中不要出现“--”或“-”
•注释不要放在标记中
•注释不能嵌套
5. PI(Processing Instruction)
PI 指 Processing Instruction, 处理指令。PI以“”开头,以“?>”结束,用来给下游的文档传递信息。
6 PCDATA
#PCDATA: specifies that an element will contain parsed character data.
7 CDATA
CDATA用于需要把整段文本解释成纯字符数据而不是标记的情况。当一些文本中包含很多“”,“&”,“””等字符而非标记时,CDATA会非常有用。
以“”结束。注意,在CDATA段中不要出现结束定界符“]]>”。
8 Entities(实体)
Entities(实体)是XML的存储单元,一个实体可以是字符串,文件,数据库记录等。实体的用处主要是为了避免在文档中重复输入,我们可以为一个文档定义一个实体名,然后在文档里引用实体名来代替这个文档,XML解析文档时,实体名会被替换成相应的文档。
XML为五个字符定义了实体名:
实体
字符
<
<
>
>
&
&
"
“
'
‘
9 DOCTYPE
“]>”紧随XML声明,包括所有实体的声明
比较容易混淆的问题:
1. Node与Element的区别:
首先,node和Element是两个领域的概念。
node从数据结构tree上来讲的,tree由node组成。element则是XML里的概念,是XML中的数据的组成部分之一。
在Java中常用DOM来解析XML文档,DOM(文档对象模型)是对XML数据的描述体系,它用树型结构的文档来保存XML数据。它把XML文档看作是一系列node和node间的关系,并且把每一个node都当作一个对象,所以叫文档对象模型。
DOM将文档中的所有都看作节点,也就说,所有的XML单元,无论是文档、元素还是属性、文本,在DOM中都是一个Node(节点),每个Node又可以包容其他的Node,这样就构成了一个树型结构。
node有几个子类型:Element, Text, Attribute, RootElement, Comment, Namespace等,其中Element是可以有属性和子节点的node。故一个节点不一定是一个元素,而一个元素一定是一个节点。只有含有完整信息的节点才能成为一个元素。
DOM文档树中不同类型的节点是由指定的Node子接口表示。每个Node对象都有nodeType属性,这些属性指定节点的类型。
在DOM在解析文档的时候按整个文档的结构生成一棵树,全部保存在内存中。虽然DOM中所有的对象均能继承用于处理父节点和子节点的属性和方法,但是并不是所有的对象都拥有父节点或子节点。例如,文本节点不能拥有子节点。另一个需要注意的地方就是,XML文档两个标签之间的空白也是这棵树的一个节点(Text节点), 包括回车、Tab等。。
DOM的基本用法:
1、创建Document
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //DocumentBuilderFactory类可以用为DOM的主入口
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("abc.xml");
2、浏览XML文档的内容
获得Document后的第一步就是获得root element,也叫document element:
Element root = doc.getDocumentElement();
3、修改XML文档
修改已有节点的值调用Node.setNodeValue();
修改已有的节点,调用replaceChild();
删除一个节点调用removeChild();
创建新节点,使用append()或insertBefore()来插入到合适的地方。
此外Attr比较特殊:为一个元素添加属性需要用setAttribute()方法,而删除属性则要用removeAttribute()方法,修改属性值调用用setValue();
4.输出XML文档
输出到磁盘上,事实上和DOM没什么关系,而是用FileWriter或FileOutputStream把文档输出到一个文件中而已。注意一点,调用FileWriter.write()时,写的不是Document对象,而是根元素对象:writer.write(root);
创建一个新的xml文档时,可以使用DocumentBuilder的另一个方法是newDocument()。创建了一个新的文档,然后就可以创建其中一系列的节点,并联结起来,形成一个完整的文档输出。