当前位置: 首页 > news >正文

!!Dom4j 学习笔记

 

以下代码从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元素中含有的信息:

MethodComment
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对象,可以使用它的以下方法访问其中的信息:

MethodComment
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对象,然后把它作为参数调用Elementremove()方法。

Updating an Attribute

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

Updating an Element's Text

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

public void updateText(Element element, String newText) {
    if (element.isTextOnly()) {
        element.clearContent();
        element.addText(newText);
    }
    return;
}

相关文章:

  • 豪华的办公设备
  • DOM详解
  • Apache FileUpload 上传以及 JExcelApi 解析
  • this的使用
  • !!java web学习笔记(一到五)
  • (ibm)Java 语言的 XPath API
  • 一、java环境搭建
  • IE与firefox下的css区别
  • copy与strong的举例
  • 浅谈PHP与Java之Web开发整合技术
  • Notepad++中常用的插件
  • 多个.class 打包成 .jar
  • 当项目出现空闲时候,如何开展软件测试工作?
  • php中调用java类的方法
  • 利用SWFTools工具将pdf转换成swf
  • 时间复杂度分析经典问题——最大子序列和
  • 【css3】浏览器内核及其兼容性
  • 【mysql】环境安装、服务启动、密码设置
  • 07.Android之多媒体问题
  • Effective Java 笔记(一)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript学习总结——原型
  • js 实现textarea输入字数提示
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel 菜鸟晋级之路
  • maya建模与骨骼动画快速实现人工鱼
  • mockjs让前端开发独立于后端
  • 飞驰在Mesos的涡轮引擎上
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信公众号开发小记——5.python微信红包
  • 小程序开发中的那些坑
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个完整Java Web项目背后的密码
  • 译有关态射的一切
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 阿里云API、SDK和CLI应用实践方案
  • ​业务双活的数据切换思路设计(下)
  • (6)设计一个TimeMap
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)ssm高校实验室 毕业设计 800008
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (转) ns2/nam与nam实现相关的文件
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)IOS中获取各种文件的目录路径的方法
  • .gitignore文件_Git:.gitignore
  • .net core 6 集成和使用 mongodb
  • .Net core 6.0 升8.0
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net MySql
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET中使用Redis (二)
  • .py文件应该怎样打开?
  • :=
  • @ConditionalOnProperty注解使用说明