Java操作XML
- XML语法
- 一个XML文件分为文档声明、元素、属性、注释、CDATA区、特殊字符、处理指令。
- 转义字符
- 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。
& => &
< => <
> => >
" => "s;
' => '
- CDATA区
- 在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。此时,可以把内容放在CDATA区里,XML解析程序原封不动的输出。
<![CDATA[ 内容 ]]>
- 处理指令
- 处理指令用来指挥解析引擎如何解析XML文档的内容。比如在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
<?xml-stylesheet type="text/css" href="1.css"?>
- 处理指令必须以
“<?”开头,以“?>”
结尾,XML声明语句是最常见的一种处理指令。
- SAX解析
-
在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。SAX解析允许在读取文档的时候,就对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
-
SAX采用事件处理的方式解析XML文档,利用SAX解析XML文档,涉及解析器和事件处理器。
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以使用指定解析器去解析某个XML文档。解析器采用SAX方式解析文档时,只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
- SAX方式解析XML文档
//使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
//通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
//通过解析器对象得到XML读取器
XMLReader xmlReader = sp.getXMLReader();
//设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
//解析xml文档
xmlReader.parse("book.xml");
-
实现ContentHandler接口,实现startElement、characters、endElement方法。
-
输出指定标签值。
class TagHander extends DefaultHandler{
private String tagName;
private int choice = 2; //要读取第几本书的版本号
private int currenctVersion; //当前读取到第几本书
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
tagName = name;
if (name.equals("version")) {
currenctVersion++;
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ("version".equals(tagName) && currenctVersion == choice) {
System.out.println(new String(ch,start,length));
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
tagName = null;
}
}
}
- XML约束
- 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范称为XML约束。
- 常用约束技术有XML DTD、XML Schema。
- DTD
- Document Type Definition,使用UTF-8或Unicode。在DTD文档中使用ELEMENT声明一个XML元素。
<!ELEMENT 元素名称 元素类型>
,元素类型可以是元素内容或类型。DTD规范定义了几种类型如EMPTY用于定义空元素,ANY表示元素内容为任意类型。
<!-- book.dtd -->
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!-- book.xml -->
<?xml version="1.0"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>一千零一夜</书名>
<作者>佚名</作者>
<售价>未知</售价>
</书>
</书架>
- 元素内容可以使用如下方式描述内容的组成关系
<!-- 用逗号分隔,表示内容的出现顺序必须与声明时一致 -->
<!ELEMENT MYFILE(TITLE,AUTHOR,EMAIL)>
<!-- 用|分隔,表示任选其一 -->
<!ELEMENT MYFILE(TITLE|AUTHOR|EMAIL)>
- 在元素内容中可以使用
+、*、?
等符号表示元素出现的次数,+
表示一次或多次,?
表示0次或一次,*
表示0次或多次,(元素)必须出现一次。使用圆括号批量设置。
- 属性定义
- xml文档中的标签属性需要通过ATTLIST为其设置属性。
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
......>
<!ATTLIST 商品
类别 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
<商品 类别="服装" 颜色="黄色"></商品>
- 常用属性值类型有CDATA普通文本字符串,ENUMERATED,ID,ENTITY实体。
- Schema约束
-
XML Schema对名称空间的支持非常好,比DTD支持更多的数据类型。一个Schema文档称为模式文档,遵循这个文档书写的xml文件称为实例文档。
-
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定。