zoukankan      html  css  js  c++  java
  • dom4j

    Maven

    • 1.6.1,支持Java 1.4+
    <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    
    
    • 2.0.2,支持Java 5+
    • 2.1.1,支持Java 8+
    <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>
    </dependency>
    
    

    XML的解析方式

    1. DOM

    DOM的全称是Document Object Model,也即文档对象模型。

    DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。

    DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。

        优点:

          1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

          2、解析过程中,树结构保存在内存中,方便修改。

        缺点:

          1、由于文件是一次性读取,所以对内存的耗费比较大。

          2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document document = db.parse("pom.xml");
    

    2. SAX

    SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。

    与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

        优点:

          1、采用事件驱动模式,对内存耗费比较小。

          2、适用于只处理XML文件中的数据时。

        缺点:

          1、编码比较麻烦。

          2、很难同时访问XML文件中的多处不同数据。

    3. JDOM

        特征:

          1、仅使用具体类,而不使用接口。

          2、API大量使用了Collections类。

    SAXBuilder saxBuilder = new SAXBuilder();
    InputStream in = new FileInputStream("pom.xml");
    Document document = saxBuilder.build(in);
    System.out.println(document);
    

    4. DOM4J

        特征:

          1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。

          2、它使用接口和抽象基本类方法。

          3、具有性能优异、灵活性好、功能强大和极端易用的特点。

          4、是一个开放源码的文件

    SAXReader reader = new SAXReader();
    Document document = reader.read("pom.xml");
    

    读取XML

    SAXReader reader = new SAXReader();
    Document document = reader.read("pom.xml");
    Element rootElement = document.getRootElement();
    System.out.println(document.asXML()); // 有声明
    System.out.println("=========================================");
    System.out.println(rootElement.asXML()); // 没有声明
    

    使用遍历器Iterator

    // 遍历所有节点
    Element rootElement = document.getRootElement();
    for (Iterator<Element> it = rootElement.elementIterator(); it.hasNext();) {
    	Element element = it.next();
    
    }
    
    // 遍历指定节点
    Element dependencies = rootElement.element("dependencies");
    for (Iterator<Element> it = dependencies.elementIterator("dependency"); it.hasNext();) {
    	Element element = it.next();
        
    }
    

    使用Xpath导航

    // 多个相同名称的节点
    List<Node> nodeList = document.selectNodes("//dependency");
    
    // 单个节点
    Node node = document.selectSingleNode("//version");
    
    // 节点的属性
    String name = node.valueOf("@name");
    
    • 获取单个节点时,若存在多个节点,获取第一个

    快速遍历节点中的内容

    public void treeWalk(Document document) {
    	treeWalk(document.getRootElement());
    }
    
    public void treeWalk(Element element) {
    	for (int i = 0, size = element.nodeCount(); i < size; i++) {
    		Node node = element.node(i);
    		if (node instanceof Element) {
    			treeWalk((Element) node);
    		} else {
    			// do something…
    		}
    	}
    }
    

    创建XML

    Document document = DocumentHelper.createDocument();
    

    导出XML到文件中

    FileWriter out = new FileWriter("foo.xml");
    document.write(out);
    out.close();
    

    XML与文本的转换

    • String转XML
    String text = "<person> <name>James</name> </person>";
    Document document = DocumentHelper.parseText(text);
    
    • XML转String
    String text = document.asXML();
    

    格式化输出XML

    // 格式化
    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter writer = new XMLWriter(System.out, format);
    writer.write(document);
    
    // 紧凑
    format = OutputFormat.createCompactFormat();
    writer = new XMLWriter(System.out, format);
    writer.write(document);
    

    格式化XML字符串

    Document document = DocumentHelper.parseText(xml);
    OutputFormat outputFormat = OutputFormat.createPrettyPrint();
    outputFormat.setEncoding("UTF-8");
    outputFormat.setSuppressDeclaration(true);
    
    StringWriter stringWriter = new StringWriter();
    XMLWriter xmlWriter = new XMLWriter(stringWriter, outputFormat);
    xmlWriter.write(document);
    System.out.println(stringWriter.toString());
    

    参考资料

  • 相关阅读:
    网络七层
    微信小程序开发工具 常用快捷键
    BZOJ 1026 windy数 (数位DP)
    BZOJ 1026 windy数 (数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    CodeForces 55D Beautiful numbers (SPOJ JZPEXT 数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3709 Balanced Number (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
    UVA 11361 Investigating Div-Sum Property (数位DP)
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/9285705.html
Copyright © 2011-2022 走看看