您的位置:首页 > 编程语言

DOM4J介绍与代码示例(二)

2010-10-22 16:05 357 查看
1.使用File定位文件资源,并基于此获得Document实例
[align=left]SAXReader saxReader = new SAXReader();[/align]
Document document = saxReader.read(inputXml);
2.Document实例的selectNodes方法可以传入xpath,并返回一个List实例,基于此使用迭代器,完成特定的应用
List list = document.selectNodes("//students/student/@sn");
4.遍历XML文档
这里提供两种遍历方法,一种是基于迭代的遍历,一种是基于Visitor模式的遍历。
XmlTra.java
[align=left]import java.io.File;[/align]
[align=left]import java.util.Iterator;[/align]
[align=left] [/align]
[align=left]import org.dom4j.Attribute;[/align]
[align=left]import org.dom4j.Document;[/align]
[align=left]import org.dom4j.DocumentException;[/align]
[align=left]import org.dom4j.Element;[/align]
[align=left]import org.dom4j.ProcessingInstruction;[/align]
[align=left]import org.dom4j.VisitorSupport;[/align]
[align=left]import org.dom4j.io.SAXReader;[/align]
[align=left] [/align]
[align=left]public class XmlTra {[/align]
[align=left] private File inputXml;[/align]
[align=left] [/align]
[align=left] public XmlTra(File inputXml) {[/align]
[align=left] this.inputXml = inputXml;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public Document getDocument() {[/align]
[align=left] SAXReader saxReader = new SAXReader();[/align]
[align=left] Document document = null;[/align]
[align=left] try {[/align]
[align=left] document = saxReader.read(inputXml);[/align]
[align=left] } catch (DocumentException e) {[/align]
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] return document;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public Element getRootElement() {[/align]
[align=left] return getDocument().getRootElement();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void traversalDocumentByIterator() {[/align]
[align=left] Element root = getRootElement();[/align]
[align=left] // 枚举根节点下所有子节点[/align]
[align=left] for (Iterator ie = root.elementIterator(); ie.hasNext();) {[/align]
[align=left] System.out.println("======");[/align]
[align=left] Element element = (Element) ie.next();[/align]
[align=left] System.out.println(element.getName());[/align]
[align=left] [/align]
[align=left] // 枚举属性[/align]
[align=left] for (Iterator ia = element.attributeIterator(); ia.hasNext();) {[/align]
[align=left] Attribute attribute = (Attribute) ia.next();[/align]
[align=left] System.out.println(attribute.getName() + ":"[/align]
[align=left] + attribute.getData());[/align]
[align=left] }[/align]
[align=left] // 枚举当前节点下所有子节点[/align]
[align=left] for (Iterator ieson = element.elementIterator(); ieson.hasNext();) {[/align]
[align=left] Element elementSon = (Element) ieson.next();[/align]
[align=left] System.out.println(elementSon.getName() + ":"[/align]
[align=left] + elementSon.getText());[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void traversalDocumentByVisitor() {[/align]
[align=left] getDocument().accept(new MyVisitor());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 定义自己的访问者类[/align]
[align=left] */[/align]
[align=left] private static class MyVisitor extends VisitorSupport {[/align]
[align=left] /**[/align]
[align=left] * 对于属性节点,打印属性的名字和值[/align]
[align=left] */[/align]
[align=left] public void visit(Attribute node) {[/align]
[align=left] System.out.println("attribute : " + node.getName() + " = "[/align]
[align=left] + node.getValue());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 对于处理指令节点,打印处理指令目标和数据[/align]
[align=left] */[/align]
[align=left] public void visit(ProcessingInstruction node) {[/align]
[align=left] System.out.println("PI : " + node.getTarget() + " "[/align]
[align=left] + node.getText());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 对于元素节点,判断是否只包含文本内容,如是,则打印标记的名字和 元素的内容。如果不是,则只打印标记的名字[/align]
[align=left] */[/align]
[align=left] public void visit(Element node) {[/align]
[align=left] if (node.isTextOnly())[/align]
[align=left] System.out.println("element : " + node.getName() + " = "[/align]
[align=left] + node.getText());[/align]
[align=left] else[/align]
[align=left] System.out.println("--------" + node.getName() + "--------");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public static void main(String[] argv) {[/align]
[align=left] XmlTra dom4jParser = new XmlTra(new File("students-gen.xml"));[/align]
[align=left] // dom4jParser.traversalDocumentByIterator();[/align]
[align=left] dom4jParser.traversalDocumentByVisitor();[/align]
[align=left] }[/align]
[align=left]}[/align]
方法traversalDocumentByIterator()提供一种基于迭代的遍历实现,每个Element通过elementIterator()和attributeIterator()取代其子元素和属性的迭代器。
Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可。
[align=left]public class MyVisitor extends VisitorSupport {[/align]
[align=left] public void visit(Element element) {[/align]
[align=left] System.out.println(element.getName());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void visit(Attribute attr) {[/align]
[align=left] System.out.println(attr.getName());[/align]
[align=left] }[/align]
}
调用: root.accept(new MyVisitor())
Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。
注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。
5.使用ElementHandler
XmlHandler.java
[align=left]import java.io.File;[/align]
[align=left] [/align]
[align=left]import org.dom4j.DocumentException;[/align]
[align=left]import org.dom4j.Element;[/align]
[align=left]import org.dom4j.ElementHandler;[/align]
[align=left]import org.dom4j.ElementPath;[/align]
[align=left]import org.dom4j.io.SAXReader;[/align]
[align=left] [/align]
[align=left]public class XmlHandler {[/align]
[align=left] public static void main(String[] args) {[/align]
[align=left] SAXReader saxReader = new SAXReader();[/align]
[align=left] File file = new File("students.xml");[/align]
[align=left] try {[/align]
[align=left] // 添加一个ElementHandler实例。[/align]
[align=left] saxReader.addHandler("/students/student", new StudentHandler());[/align]
[align=left] saxReader.read(file);[/align]
[align=left] [/align]
[align=left] } catch (DocumentException e) {[/align]
[align=left] System.out.println(e.getMessage());[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 定义StudentHandler处理器类,对<student>元素进行处理。[/align]
[align=left] */[/align]
[align=left] private static class StudentHandler implements ElementHandler {[/align]
[align=left] public void .Start(ElementPath path) {[/align]
[align=left] Element elt = path.getCurrent();[/align]
[align=left] System.out.println("Found student: " + elt.attribut.ue("sn"));[/align]
[align=left] // 添加对子元素<name>的处理器。[/align]
[align=left] path.addHandler("name", new NameHandler());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void .End(ElementPath path) {[/align]
[align=left] // 移除对子元素<name>的处理器。[/align]
[align=left] path.removeHandler("name");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * 定义NameHandler处理器类,对<student>的<name>子元素进行处理。[/align]
[align=left] */[/align]
[align=left] private static class NameHandler implements ElementHandler {[/align]
[align=left] public void .Start(ElementPath path) {[/align]
[align=left] System.out.println("path : " + path.getPath());[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public void .End(ElementPath path) {[/align]
[align=left] Element elt = path.getCurrent();[/align]
[align=left] // 输出<name>元素的名字和它的文本内容。[/align]
[align=left] System.out.println(elt.getName() + " : " + elt.getText());[/align]
[align=left] }[/align]
[align=left] }[/align]
}
6.使用XSLT转换XML
这里必须使用JAXP的支持。
[align=left]import javax.xml.transform.Transformer;[/align]
[align=left]import javax.xml.transform.TransformerFactory;[/align]
[align=left] [/align]
[align=left]import org.dom4j.Document;[/align]
[align=left]import org.dom4j.io.DocumentResult;[/align]
[align=left]import org.dom4j.io.DocumentSource;[/align]
[align=left] [/align]
[align=left] ……[/align]
[align=left] public Document styleDocument(Document document, String stylesheet)[/align]
[align=left] throws Exception {[/align]
[align=left] [/align]
[align=left] // load the transformer using JAXP[/align]
[align=left] TransformerFactory factory = TransformerFactory.newInstance();[/align]
[align=left] Transformer transformer = factory.newTransformer(new StreamSource(stylesheet));[/align]
[align=left] [/align]
[align=left] // now lets style the given document[/align]
[align=left] DocumentSource source = new DocumentSource(document);[/align]
[align=left] DocumentResult result = new DocumentResult();[/align]
[align=left] transformer.transform(source, result);[/align]
[align=left] [/align]
[align=left] // return the transformed document[/align]
[align=left] Document transformedDoc = result.getDocument();[/align]
[align=left] return transformedDoc;[/align]
}
……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: