12.1 XML简介
XML(Extensible Markup Language 扩展标记语言),XML区分大小写字母的;不能省略掉结束标记,单标记必须用一个/字符作为结尾;属性值必须封装在引号中,并且必须带有相应的值.
XML文档应该以一个头标开头,如<?xml version=” 1.0” ?>,头标可有可无,但最好有;头标后面是文档类型的声明,用于确保文档的正确性,但并不是必不可少的;文档包含根元素,根元素包含子元素,子元素包含子元素、文本或者同时包含子元素和文本.
一些其他的标记说明,如:
字符引用 形式 &#d (d十进制) &#xh (h十六进制) Unicode值;
字符实体引用 形式 &name 如< >等;DTD来定义其他符号实体的引用
CDATA的各个部分用<![CDATA[and]]>来限定其界限,特殊字符可用其来包含那些含有<>&子类字符的字符串;
处理命令 将用<?和?>限定其界限;
注释用<!--和-->限定其界限.
12.2 分析XML文档
分析器是个程序,它负责读取一个文件,验证该文件是否有正确的格式,将它分割成各个构成元素,并且让程序员访问这些元素.
分析器分为两种:
DOM (文档对象模型) 将XML文档读入一个树状机构;
SAX 读取XML文档时,负责生成相应的事件.
DOM读取XML文档的过程:
1. 生成文档构建器
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.new DocumentBuilder();
2. 生成文档对象模型
读文件
File f = …;
Document doc = builder.parse(f);
读URL
URL u = …;
Document doc = builder.parse(u);
读输入流
InputStream in = …;
Document doc = builder.parse(in);
3. 读取根节点
Element root = doc.getDocumentElement();
4. 获取子元素
NodeList children = root.getChildNodes();
for(int i = 0; i < children.getLength();i++){
Node child = children.item(i);
if(child instanceof Element){
Element childElement = (Element)child;
…
}
}
说明:如果文档类型声明,分析器能够抑制空白符,取得真实子元素.
5. 特定取子元素方法
getFirstChild() 取得第一个子元素;
getLastChild() 取得最后一个子元素;
getNextSibling() 取得节点的下一个兄弟元素;
6. 取得元素属性
所有属性
NameNodeMap attributes = element. getAttributes();
for(int i=0;i<attributes.getLength();i++){
Node attribute = attributes.item(i);
String name = attribute.getNodeName();
String value = attribute.getNodeValue();
…
}
某个属性
String unit = element.getAttribute(“unit”);
7. 其他常用方法
Element.getTagName() 取得元素的名字
CharacterData.getData() 取得节点中的文本
12.3 文档类型的定义
如果进行了文档类型的定义(DTD),XML分析器就能够自动检验文档的结构是否正确;用DOCTYPE声明外部DTD;用ELEMENT规则设定某个元素可以拥有什么子元素,具体采用正则表达式,语法是 <!ELEMENT menu (item)*>;用ATTLIST规则设定某个元素的合法属性,语法是 <!ATTLIST element attribute type default>;用ENTITY规则定义实体或者说分析时被取代的缩写,例如 <!ENTITY a.b “Back”>.
通过ErrorHandler接口对象的3个方法warning,error,fatalError生成XML分析器检验文档机构报错时的错误处理器;然后用DocumentBuilder.setErrorHandler()安装错误处理器.
12.4 名字空间
名字空间使用通用资源标记符(Uniform Resource Identifier,URI)来进行标识;最常用的是HTTP的URL,它可以确保名字空间的独一无二性.
12.5 使用SAX分析器
使用SAX分析器时,需要一个处理器,以便为各个不同的分析事件定义事件的动作;ContentHandler接口负责定义分析器在对文档进行分析时执行的若干个回调方法.
具体分析步骤:
1. 获取SAX分析器
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
2. 装载XML文档
parser.parse(source,handler);
其中,source可以是文件、URL字符串、输入数据流其中之一;handler属于DefaultHandler类的一个子类.
3. 接着分析文档
12.6 生成XML文档
具体生成步骤:
1. 建立一个空文档
DocumentBuilder …
Document doc = builder.newDocument();
2. 创建文档元素
Element rootElement = doc.createElement(rootName);
Element childElement = doc.createElement(childName);
3. 建立文本节点
Text textNode = doc.createTextNode(textContents);
4. 向文档添加元素
doc.appendChild(rootElement);
rootElement.appendChild(childElement);
childElement.appendChild(textNode);
5. 设定元素属性
rootElement.setAttribute(name,value);
12.7 XSL转换
使用XSL的样式表的目的是为了描述XML文档是如何向某种其他格式的文档进行转换的.
2007-08-09