JDOM Java Document Object Model
JDOM使用对象树来表示XML.
JDOM使用SAX解析器来解析XML文档,构建JDOM树.JDOM本身没有解析器.
JDOM主要API以类为主,而非接口.简化了编程,但限制了灵活性.JDOM使用集合类作为对象存储的容器.
JDOM共有七个包
org.jdom包中包含了表示XML文档及其组成部分的类.如Document,Element,Attribute和CDATA.
org.jdom.xpath 包含 XPath 查找类.
org.jom.transform 包含 XSTL 转换类.
org.jdom.adapters 包含 几种主要解析器的适配器类.
org.jdom.filter 包含 过滤文档节点的类.
org.jdom.input包下提供了如下两个类用于构建JDOM树.
DOMBuilder:将一份已有的W3C的Document对象转换为JDOM的Document.
SAXBuilder:工具类,可以将来自输入流,磁盘或指定URL所代表的XML文档转换为JDOM的Document.
org.jdom. Output包下提供三个输出工具类.
DOMOutputter 将内存中的JDOM树输出成W3C的DOM树.
SAXOutputter 将内存中的JDOM树输出到SAX2流中,用于出发SAX2事件监听器.
XMLOutputter 将内存中的JDOM树输出成XML文档.
org.jdom
常用API中只有Parent是接口.
Parent接口代表所有能包含子内容的节点.有连个实现类,Element类,和Document类.
Parent接口中常用方法:
List getContent() 返回当前元素所包含的所有子内容.
Int getContentSize() 返回该元素所包含的所有子内容的大小.
Iterator getDescendants() 获取该元素所包含的所有后代节点.
Document getDocument() 返回该元素所在的XML文档所对应的Document.
Parent getParent() 返回父元素.
Int indexOf() 返回指定子内容在当前元素的子内容列表中的索引.
List removeContent() 删除当前元素的指定子内容,并返回被删除的内容.
常用类
Document 代表XML文档.它不能是其他对象的内容.所以只是实现了Parent接口.
Content 所有JDOM对象的抽象父类.
Content的派生类:
Element XML 元素.
Text XML文档中的文本内容.
CDATA XML文档中的CDATA段.
DocType XML文档中的DOCTYPE声明.
ProcessingInstruction XML文档里的处理指令.
EntityRef XML文档中的实体引用.
Comment XML文档中的注释内容.
Attribute XML文档中的属性.属性是附属于某个元素的.所以Attribute单独的一个类.
创建XML文档
Document doc=new Document(); //创建文档.
Element eltRoot=new Element(“student”); //创建一个元素.
doc.setRootElement(eltRoot); //把元素作为文档的根元素.
或者在构造Document时,传入根元素
Element eltRoot=new Element(“student”); //创建一个元素.
Document doc=new Document(eltRoot); //创建文档,且把元素作为文档的根元素.
添加属性
eltRoot.setAttribute(“sn”,”10”);
添加子元素并设置元素内容
Element eltName=new Element(“name”) //创建元素,子元素.
Element eltAge=new Element(“age”) //创建元素,子元素.
eltName.setText(“剑圣”); //给元素添加内容.
eltAge.setText(“128”); //给元素添加内容.
eltRoot.addContent(eltName); //给元素添加子元素
eltRoot.addContent(eltAge); //给元素添加子元素
输出文档
org.jdom. Output包下
DOMOutputter 将内存中的JDOM树输出成W3C的DOM树.
SAXOutputter 将内存中的JDOM树输出到SAX2流,用于出发SAX2事件监听器.
XMLOutputter 将内存中的JDOM树输出为字节流.
例如,
XMLOutputter xmlOut=new XMLOutputter();
xmlOut.output(doc,System.out);
输出可以选择输出到文件或套接字流,或控制台输出流中.
xmlOut.output(doc,new FileOutputStream(“student.xml”));
格式化输出
Format类,用于设置输出文档的字符编码,设置行分隔符,以及设置缩进字符串.
public static Format getCompactFormat()
采用紧凑格式.即对文档中的空白进行规范化,使用UTF-8编码,不展开空元素,包含声明和编码,以及使用默认的实体转义策略.
public static Format getRowFormat()
采用原始格式.即对文档中的空白保持不变,使用UTF-8编码,不展开空元素,包含声明和编码, 以及使用默认的实体转义策略.
public static Format getPrettyFormat()
采用美化的格式.即使用两个空格作为缩进来输出文档, 不展开空元素,包含声明和编码,以及使用默认的实体转义策略.
下面采用美化的格式输出文档至控制台输出流,设置字符编码为GB2312.
Format fmt=Format.getPrettyFormat(); //得到格式对象.
fmt.setEncoding(“GB2312”); //设置格式对象的编码
fmt.setIndent(“ ”); //设置格式对象的缩进
xmlOut.setFormat(fmt); //输出对象设置格式(即把格式对象绑定到输出对象)
xmlOut.output(doc,System.out); //输出对象把文档对象传至输出流.
构建JDOM树
org.jdom.input包下提供了如下两个类用于构建JDOM树.
DOMBuilder:将已有的W3C DOM的Document对象或Element对象转换为JDOM的对象.
SAXBuilder: 使用一个第三方的SAX解析器,将不同输入源(输入流,磁盘或指定URL所代表的XML文档)转换为JDOM的Document.
以DOMBuilder类构造JDOM文档对象.
DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance(); //构建W3C DOM解析器工厂
DocumentBuilder db= dbf.newDocumentBuilder(); //构建解析器
File file=new File(“students.xml”); //引用文件
org.w3c.dom.Document document=db.parse(file); //得到W3C DOM document
DOMBuilder domBuilder=new DOMBuilder(); //创建JDOM的domBuilder
org.jdom.Document doc=domBuilder.builder(document); // W3C DOM document
转为 JDOM document.
访问根元素
使用Document类的getRootElement()方法,用于返回文档的根元素.
Element root=doc.getRootElement();
访问子元素
在Element类中定义了获取子元素的方法.
要得到某个元素的所有子元素.
java.util.List childrenList=element.getChildren(); //
要得到某个元素的指定名称的子元素
java.util.List childrenList=element.getChildren(“student”); //
要得到指定名称元素的第一个子元素
java.util.List childrenList=element.getChild (“student”); //
要删除某个元素的指定名称的所有子元素
element.removeChildren (“student”); //
要删除某个元素的指定名称的第一个元素
element. removeChildren (“student”); //
访问属性
在Element类中定义了访问元素属性的方法.
要得到某元素的所有属性
java.util.List attrList=element.getAttributes(); //
要得到指定的属性
Attribute attr=element.getAttribute(“sn”); //
要得到指定的属性的值
String attrValue=element.getAttributeValue(“sn”); //
要删除指定的属性
element.removeAttribute (“sn”); //
验证XML文档
使用DTD验证
在构造SAXBuilder对象时传入参数true.
使用Scheme验证