`
blueyanghualong
  • 浏览: 228582 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Dom4J 笔记

XML 
阅读更多

 

Loading XML Data

以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象。一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行遍历、查询、修改等操作。

import java.io.*;
import java.net.*;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class XMLLoader {
    
    private Document doc = null;
    
    public void parseWithSAX(File file)
    throws MalformedURLException, DocumentException {
        SAXReader xmlReader = new SAXReader();
        this.doc = xmlReader.read(file);
        return;
    }
    
    public void parseWithSAX(URL url)
    throws MalformedURLException, DocumentException {
        SAXReader xmlReader = new SAXReader();
        this.doc = xmlReader.read(url);
        return;
    }
}
        

QName and Namespace

QName对象表示了一个XML元素或属性的qualified name,即一个namespace和一个local name的二元组。

Namespace对象表示了QName二元组中的namespace部分,它由prefix和URI两部分组成。

/******************** SAMPLE XML FILE *************************
  <heavyz:Sample
    xmlns:heavyz="http://www.heavyzheng.com/schema/sample.xsd">
    <heavyz:HelloWorld/>
  </heavyz:Sample>
  *************************************************************/
  
public void printRootQNameInfo(Document doc) {
    Element root = doc.getRootElement();
    QName qname = root.getQName();
    System.out.println("local name      : " + qname.getName());
    System.out.println("namespace prefix: " + qname.getNamespacePrefix());
    System.out.println("namespace URI   : " + qname.getNamespaceURI());
    System.out.println("qualified name  : " + qname.getQualifiedName());
    return;
}

/************************* OUTPUT *****************************
  localname       : Sample
  namespace prefix: heavyz
  namespace URI   : http://www.heavyzheng.com/schema/sample.xsd
  qualified name  : heavyz:Sample
  *************************************************************/
        

可以调用Namespace(String prefix, String uri)构造方法构造一个新的Namespace对象;也可以调用Namespace.get(String prefix, String uri)静态方法获得一个新的Namespace对象。

可以调用QName(String name)构造方法构造一个没有 namespace的qualified name;或者调用QName(String name, Namespace namespace)构造方法构造一个有namespace的qualified name。
Navigating Through an XML Tree

对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的Element对象们的一个iterator。使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。

通过递归的方法,以下代码可以根据Document对象打印出完整的XML树。

public void printXMLTree(Document doc) {
    Element root = doc.getRootElement();
    printElement(root,0);
    return;
}
    
private void printElement(Element element, int level) {
    // print indent
    for (int i=0; i<level; i++) {
        System.out.print(" ");
    }
    System.out.println(element.getQualifiedName());
    Iterator iter = element.elementIterator();
    while (iter.hasNext()) {
        Element sub = (Element)iter.next();
        printElement(sub,level+2);
    }
    return;
}
        

Getting Information from an Element

可以通过Element类提供的方法访问一个XML元素中含有的信息:
Method 	Comment
getQName() 	元素的QName对象
getNamespace() 	元素所属的Namespace对象
getNamespacePrefix() 	元素所属的Namespace对象的prefix
getNamespaceURI() 	元素所属的Namespace对象的URI
getName() 	元素的local name
getQualifiedName() 	元素的qualified name
getText() 	元素所含有的text内容,如果内容为空则返回一个空字符串而不是null
getTextTrim() 	元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null
attributeIterator() 	元素属性的iterator,其中每个元素都是Attribute对象
attributeValue() 	元素的某个指定属性所含的值
elementIterator() 	元素的子元素的iterator,其中每个元素都是Element对象
element() 	元素的某个指定(qualified name或者local name)的子元素
elementText() 	元素的某个指定(qualified name或者local name)的子元素中的text信息
getParent 	元素的父元素
getPath() 	元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用"/"分隔
isTextOnly() 	是否该元素只含有text或是空元素
isRootElement() 	是否该元素是XML树的根节点

要取出Element对象中某个属性的信息,可以调用attributeIterator()方法获得一个Attribute对象的iterator,然后再遍历它。也可以直接调用attributeValue()方法获得指定属性的值。该方法接受四种类型的参数:

    * attributeValue(QName qname):通过指定qualified name获得属性值,如果无法找到指定的属性,则返回null。
    * attributeValue(QName qname, String defaultValue):通过指定qualified name获得属性值,如果无法找到指定的属性,则返回defaultValue。
    * attributeValue(String name):通过指定local name获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回null。
    * attributeValue(String name, String defaultValue):通过指定local name获得属性值,而忽略属性的namespace,如果无法找到指定的属性,则返回defaultValue。

对于一个Attribute对象,可以使用它的以下方法访问其中的信息:
Method 	Comment
getQName() 	属性的QName对象
getNamespace() 	属性所属的Namespace对象
getNamespacePrefix() 	属性所属的Namespace对象的prefix
getNamespaceURI() 	属性所属的Namespace对象的URI
getName() 	属性的local name
getQualifiedName() 	属性的qualified name
getValue() 	属性的值

Writing an XML Tree to OutputStream

Dom4j通过XMLWriter将由Document对象表示的XML树写入一个文件,并使用OutputFormat格式对象指定写入的风格和编码方法。调用OutputFormat.createPrettyPrint()方法可以获得一个默认的 pretty print风格的格式对象。对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

public void writeTo(OutputStream out, String encoding)
throws UnsupportedEncodingException, IOException {
    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("gb2312");
    XMLWriter writer = new XMLWriter(System.out,format);
    writer.write(doc);
    writer.flush();
    return;
}
        

Creating an XML Tree

使用DocumentFactory对象创建一个空的Document对象。DocumentFactory对象由DocumentFactory.getInstance()静态方法产生。对Document对象调用addElement()方法将创建XML根节点,并将该节点返回。也可以手工创建一个Element对象并调用Document.setRootElement()方法把它设置为根节点

import org.dom4j.DocumentFactory;
import org.dom4j.Document;
import org.dom4j.Element;

public class XMLSaver {
    
    private DocumentFactory factory = null;
    private Document doc = null;
    private Element root = null;
    
    public XMLSaver() {
        factory = DocumentFactory.getInstance();
        doc = factory.createDocument();
    }
    
    public Element generateRoot(String name) {
        root = doc.addElement(name);
        return root;
    }
    
    public Element generateRoot(QName qname) {
        root = doc.addElement(qname);
        return root;
    }
    
    public Element generateRoot(Element element) {
        doc.setRootElement(element);
        root = element;
        return root;
    }
}
        

Adding Information into an Element

Element通过addElement()为自己增加一个子节点到当前所有子节点的后面。该方法可以接受三种不同类型的参数:(QName qname)、(String name)或者(String qualifiedName, String namespaceURI)。该方法返回增加的子节点的Element对象。

Element通过addAttribute()为自己增加属性。该方法可以接受两种不同类型的参数:(QName qname, String value)或者(String name, String value)。该方法返回自身的Element对象。

Element通过addText()为自己增加文本内容。该方法只接受String类型参数,并返回自身的Element对象。

public void addAuthors(Element bookElement) {

    Element author1 = bookElement.addElement("author");
    author1.addAttribute("name","Toby");
    author1.addAttribute("location","Germany");
    author1.addText("Tobias Rademacher");

    Element author2 = bookElement.addElement("author");
    author2.addAttribute("name","James");
    author2.addAttribute("name","UK");
    author2.addText("James Strachan");
    
    return;
}
        

Deleting Elements and Attributes

要删除XML树上的一棵子树,首先要找到该子树的根节点,然后对该节点调用detach()方法。注意:如果对根节点调用了detach()方法,将导致该XML树不再完整(一个 XML文件需要有且仅有一个根节点)。

public void deleteSubtree(Element subtreeRoot) {
    subtreeRoot.detach();
    return;
}
        

要清除Element下的所有子节点(包括Element和text),可以对该Element调用clearContent()方法。该方法不会清除Element的属性。

要清除Element下的某个Attribute,首先要获得该Attribute对象,然后把它作为参数调用Element的remove()方法。
Updating an Attribute

要更新一个属性的内容,首先要获得该Attribute对象,然后可以调用setNamespace()方法更新它所属的namespace;调用setValue()方法更新它的属性值。
Updating an Element's Text

可以对一个Element对象调用isTextOnly()方法判断它是否只含有text或者是空节点。对Element对象调用addText()方法将把一个字符串附加到Element中,但不会修改它原来拥有的text或者子节点。如果Element是isTextOnly(),要修改原来含有的text,可以先调用clearContent(),再调用addText()并把新值传入。

public void updateText(Element element, String newText) {
    if (element.isTextOnly()) {
        element.clearContent();
        element.addText(newText);
    }
    return;
}
        
分享到:
评论

相关推荐

    DOM4J笔记.学习如何应用DOM4J开发XML

    DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了简单而直观的方式来解析、创建、修改和查询XML数据。以下是对DOM4J主要功能的详细说明: 1. **解析XML文档** DOM4J使用SAXReader类来解析XML文档。在示例...

    Dom4j学习笔记

    **标题解析:** "Dom4j学习笔记" 这个标题明确指出了我们要探讨的主题——Dom4j。Dom4j是一个流行的Java库,用于处理XML文档。它提供了丰富的API,使得XML的读取、写入、操作变得简单易行。在学习笔记中,通常会涵盖...

    XML DOM4J学习笔记

    本篇笔记将深入探讨XML DOM4J的学习要点。 一、XML基础知识 1. XML结构:XML文档由元素(Element)、属性(Attribute)、文本内容(Text)、注释(Comment)等组成。每个XML文档都有一个根元素,其他元素嵌套在根...

    dom4j 学习笔记

    **DOM4J学习笔记** DOM4J是一个强大的Java XML API,它提供了丰富的XML处理功能,包括文档构建、解析、修改和查询。作为一个开源项目,DOM4J在XML处理领域具有广泛的用户基础,因其简单易用和高效性能而备受青睐。...

    树懒_day05.1_xml_DOM4J笔记

    移动开发的小白树懒正在努力的学习移动开发中的web体系中的xml解析,每天提高自己...

    dom4j学习笔记.txt

    ### DOM4J学习笔记 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML数据。它提供了一种非常灵活的方式来解析、创建和修改XML文档。DOM4J是一个开源项目,由Red Hat公司支持。相较于其他XML解析器如DOM、SAX等...

    dom4j学习笔记

    **DOM4J学习笔记** DOM4J是一个Java库,它提供了强大的XML处理功能,包括解析、操作和生成XML文档。这个库是开源的,广泛应用于Java应用程序中,特别是在需要处理XML数据时。DOM4J的设计目标是易于使用,同时保持高...

    DOM4J学习笔记

    DOM4J的学习笔记主要涵盖以下几个核心知识点: 1. **DOM4J概述**: DOM4J是一个开源项目,其设计目标是提供一个简单且功能丰富的XML API,它既支持SAX和DOM,又引入了面向对象的设计,使得XML处理更加方便。DOM4J...

    Dom4j 解析Xml文档及 XPath查询 学习笔记

    **标题:** Dom4j 解析Xml文档及 XPath查询 学习笔记 **正文:** XML(eXtensible Markup Language)是一种标记语言,常用于数据交换、配置存储以及文档结构化表示。在Java世界中,解析XML文档有多种库,其中Dom4j是...

    Java创建xml文档笔记(DOM,DOM4J)

    本笔记将深入探讨如何使用DOM(文档对象模型)和DOM4J库来创建XML文档。 一、DOM解析器 DOM是W3C推荐的一种XML解析标准,它将整个XML文档加载到内存中,形成一棵树形结构,称为DOM树。通过DOM,我们可以方便地访问...

    dom4j 包含例子 各种增删改查

    "2012-4-10 有关 xml dom4j的 crud"可能是另一个教程或者笔记,详细讲解了如何利用DOM4J进行XML的CRUD操作。这个文件可能包含了详细的步骤和代码示例,对于学习DOM4J非常有帮助。 "自己写的 dom4j的例子"很显然是...

    Dom4j学习教程+API+xml实用大全+xml学习笔记+htc

    标题"Dom4j学习教程+API+xml实用大全+xml学习笔记+htc"提及了几个关键主题,包括Dom4j的学习资源、API文档,以及关于XML的实用指南和学习笔记,还提到了一个名为"htc"的文件,可能是关于HTC设备或技术的文档。...

    dom4j解析XML(学习笔记)

    ### DOM4j解析XML知识点详解 #### 一、DOM4j简介 DOM4j是一个用于处理XML文档的Java库,其名称来源于“Document Object Model for Java”,但它与标准的DOM API并不完全相同,而是提供了更为简便和高效的方式来...

    dom4j包(用于xml)

    用于xml,dom4j解析比进口快不崩溃崩溃笔记本尽快

    DOM学习笔记

    在JavaWeb开发中,DOM解析器如JDOM、DOM4J等被用于处理XML文件。例如,使用DOM解析XML文件,读取、修改或创建XML结构: ```java import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; ...

    xml学习笔记

    7. **XML序列化与反序列化**:DOM4J可以将XML Document对象写入文件,实现XML的序列化,反之,也可以从文件中读取XML并构建DOM4J对象,这就是反序列化。 8. **事件驱动模型SAX**:虽然DOM4J主要基于DOM模型,但也...

    java与xml 学习笔记整理

    另外,JDOM和DOM4J是两个流行的DOM替代库,提供了更友好的API来操作XML,尤其是对于复杂的XML结构。 JDOM简化了DOM的一些操作,它使用Java对象直接映射XML元素,使得操作更直观。DOM4J则在DOM的基础上进行了扩展,...

Global site tag (gtag.js) - Google Analytics