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
方法traversalDocumentByIterator()提供一种基于迭代的遍历实现,每个Element通过elementIterator()和attributeIterator()取代其子元素和属性的迭代器。
Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可。
调用: root.accept(new MyVisitor())
Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。
注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。
5.使用ElementHandler
XmlHandler.java
6.使用XSLT转换XML
这里必须使用JAXP的支持。
[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] |
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] } |
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] } |
这里必须使用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] } …… |
相关文章推荐
- DOM4J介绍与代码示例(转载)
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例(2)-XPath 详解
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例 推荐
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例(一)
- DOM4J介绍与代码示例【转载】
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例
- DOM4J介绍与代码示例 (强大的xml处理工具)
- DOM4J介绍与代码示例
- 在java中使用dom4j解析xml(示例代码)
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例详细介绍
- 在java中使用dom4j解析xml(示例代码)
- 在java中使用dom4j解析xml(示例代码)
- 通俗易懂地介绍梯度下降法(以线性回归为例,配以Python示例代码)
- Autolayout的简单介绍和示例代码