java解析xml汇总_动力节点Java学院整理

【引言】

目前在Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j,下文主要介绍这4种解析XML文档技术的使用、优缺点及性能测试。

一、【基础知识——扫盲】

sax、dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的;jaxp只是api,它进一步封装了sax、dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器)。

二、【DOM、SAX、JDOM、DOM4j简单使用介绍】

1、【DOM(Document Object Model) 】

由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。

示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<university name="pku">
  <college name="c1">
    <class name="class1">
      <student name="stu1" sex='male' age="21" />
      <student name="stu2" sex='female' age="20" />
      <student name="stu3" sex='female' age="20" />
    </class>
    <class name="class2">
      <student name="stu4" sex='male' age="19" />
      <student name="stu5" sex='female' age="20" />
      <student name="stu6" sex='female' age="21" />
    </class>
  </college>
  <college name="c2">
    <class name="class3">
      <student name="stu7" sex='male' age="20" />
    </class>
  </college>
  <college name="c3">
  </college>
</university>

后文代码中有使用到text.xml(该文档放在src路径下,既编译后在classes路径下),都是指该xml文档。

package test.xml; 

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException; 

/**
 * dom读写xml
 * @author whwang
 */
public class TestDom { 

  public static void main(String[] args) {
    read();
    //write();
  } 

  public static void read() {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
      DocumentBuilder builder = dbf.newDocumentBuilder();
      InputStream in = TestDom.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.parse(in);
      // root <university>
      Element root = doc.getDocumentElement();
      if (root == null) return;
      System.err.println(root.getAttribute("name"));
      // all college node
      NodeList collegeNodes = root.getChildNodes();
      if (collegeNodes == null) return;
      for(int i = 0; i < collegeNodes.getLength(); i++) {
        Node college = collegeNodes.item(i);
        if (college != null && college.getNodeType() == Node.ELEMENT_NODE) {
          System.err.println("\t" + college.getAttributes().getNamedItem("name").getNodeValue());
          // all class node
          NodeList classNodes = college.getChildNodes();
          if (classNodes == null) continue;
          for (int j = 0; j < classNodes.getLength(); j++) {
            Node clazz = classNodes.item(j);
            if (clazz != null && clazz.getNodeType() == Node.ELEMENT_NODE) {
              System.err.println("\t\t" + clazz.getAttributes().getNamedItem("name").getNodeValue());
              // all student node
              NodeList studentNodes = clazz.getChildNodes();
              if (studentNodes == null) continue;
              for (int k = 0; k < studentNodes.getLength(); k++) {
                Node student = studentNodes.item(k);
                if (student != null && student.getNodeType() == Node.ELEMENT_NODE) {
                  System.err.print("\t\t\t" + student.getAttributes().getNamedItem("name").getNodeValue());
                  System.err.print(" " + student.getAttributes().getNamedItem("sex").getNodeValue());
                  System.err.println(" " + student.getAttributes().getNamedItem("age").getNodeValue());
                }
              }
            }
          }
        }
      }
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } 

  } 

  public static void write() {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
      DocumentBuilder builder = dbf.newDocumentBuilder();
      InputStream in = TestDom.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.parse(in);
      // root <university>
      Element root = doc.getDocumentElement();
      if (root == null) return;
      // 修改属性
      root.setAttribute("name", "tsu");
      NodeList collegeNodes = root.getChildNodes();
      if (collegeNodes != null) {
        for (int i = 0; i <collegeNodes.getLength() - 1; i++) {
          // 删除节点
          Node college = collegeNodes.item(i);
          if (college.getNodeType() == Node.ELEMENT_NODE) {
            String collegeName = college.getAttributes().getNamedItem("name").getNodeValue();
            if ("c1".equals(collegeName) || "c2".equals(collegeName)) {
              root.removeChild(college);
            } else if ("c3".equals(collegeName)) {
              Element newChild = doc.createElement("class");
              newChild.setAttribute("name", "c4");
              college.appendChild(newChild);
            }
          }
        }
      }
      // 新增节点
      Element addCollege = doc.createElement("college");
      addCollege.setAttribute("name", "c5");
      root.appendChild(addCollege);
      Text text = doc.createTextNode("text");
      addCollege.appendChild(text); 

      // 将修改后的文档保存到文件
      TransformerFactory transFactory = TransformerFactory.newInstance();
      Transformer transFormer = transFactory.newTransformer();
      DOMSource domSource = new DOMSource(doc);
      File file = new File("src/dom-modify.xml");
      if (file.exists()) {
        file.delete();
      }
      file.createNewFile();
      FileOutputStream out = new FileOutputStream(file);
      StreamResult xmlResult = new StreamResult(out);
      transFormer.transform(domSource, xmlResult);
      System.out.println(file.getAbsolutePath());
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (TransformerConfigurationException e) {
      e.printStackTrace();
    } catch (TransformerException e) {
      e.printStackTrace();
    }
  }
}

该代码只要稍做修改,即可变得更加简洁,无需一直写if来判断是否有子节点。

2、【SAX (Simple API for XML) 】

SAX不用将整个文档加载到内存,基于事件驱动的API(Observer模式),用户只需要注册自己感兴趣的事件即可。SAX提供EntityResolver, DTDHandler, ContentHandler, ErrorHandler接口,分别用于监听解析实体事件、DTD处理事件、正文处理事件和处理出错事件,与AWT类似,SAX还提供了一个对这4个接口默认的类DefaultHandler(这里的默认实现,其实就是一个空方法),一般只要继承DefaultHandler,重写自己感兴趣的事件即可。

示例代码:

package test.xml; 

import java.io.IOException;
import java.io.InputStream; 

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler; 

/**
 *
 * @author whwang
 */
public class TestSAX { 

  public static void main(String[] args) {
    read();
    write();
  } 

  public static void read() {
    try {
      SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser parser = factory.newSAXParser();
      InputStream in = TestSAX.class.getClassLoader().getResourceAsStream("test.xml");
      parser.parse(in, new MyHandler());
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  public static void write() {
    System.err.println("纯SAX对于写操作无能为力");
  } 

} 

// 重写对自己感兴趣的事件处理方法
class MyHandler extends DefaultHandler { 

  @Override
  public InputSource resolveEntity(String publicId, String systemId)
      throws IOException, SAXException {
    return super.resolveEntity(publicId, systemId);
  } 

  @Override
  public void notationDecl(String name, String publicId, String systemId)
      throws SAXException {
    super.notationDecl(name, publicId, systemId);
  } 

  @Override
  public void unparsedEntityDecl(String name, String publicId,
      String systemId, String notationName) throws SAXException {
    super.unparsedEntityDecl(name, publicId, systemId, notationName);
  } 

  @Override
  public void setDocumentLocator(Locator locator) {
    super.setDocumentLocator(locator);
  } 

  @Override
  public void startDocument() throws SAXException {
    System.err.println("开始解析文档");
  } 

  @Override
  public void endDocument() throws SAXException {
    System.err.println("解析结束");
  } 

  @Override
  public void startPrefixMapping(String prefix, String uri)
      throws SAXException {
    super.startPrefixMapping(prefix, uri);
  } 

  @Override
  public void endPrefixMapping(String prefix) throws SAXException {
    super.endPrefixMapping(prefix);
  } 

  @Override
  public void startElement(String uri, String localName, String qName,
      Attributes attributes) throws SAXException {
    System.err.print("Element: " + qName + ", attr: ");
    print(attributes);
  } 

  @Override
  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    super.endElement(uri, localName, qName);
  } 

  @Override
  public void characters(char[] ch, int start, int length)
      throws SAXException {
    super.characters(ch, start, length);
  } 

  @Override
  public void ignorableWhitespace(char[] ch, int start, int length)
      throws SAXException {
    super.ignorableWhitespace(ch, start, length);
  } 

  @Override
  public void processingInstruction(String target, String data)
      throws SAXException {
    super.processingInstruction(target, data);
  } 

  @Override
  public void skippedEntity(String name) throws SAXException {
    super.skippedEntity(name);
  } 

  @Override
  public void warning(SAXParseException e) throws SAXException {
    super.warning(e);
  } 

  @Override
  public void error(SAXParseException e) throws SAXException {
    super.error(e);
  } 

  @Override
  public void fatalError(SAXParseException e) throws SAXException {
    super.fatalError(e);
  } 

  private void print(Attributes attrs) {
    if (attrs == null) return;
    System.err.print("[");
    for (int i = 0; i < attrs.getLength(); i++) {
      System.err.print(attrs.getQName(i) + " = " + attrs.getValue(i));
      if (i != attrs.getLength() - 1) {
        System.err.print(", ");
      }
    }
    System.err.println("]");
  }
}

3、【JDOM】

JDOM与DOM非常类似,它是处理XML的纯JAVA API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口。 JDOM 它自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档

示例代码:

package test.xml; 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List; 

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter; 

/**
 * JDom读写xml
 * @author whwang
 */
public class TestJDom {
  public static void main(String[] args) {
    //read();
    write();
  } 

  public static void read() {
    try {
      boolean validate = false;
      SAXBuilder builder = new SAXBuilder(validate);
      InputStream in = TestJDom.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.build(in);
      // 获取根节点 <university>
      Element root = doc.getRootElement();
      readNode(root, "");
    } catch (JDOMException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  @SuppressWarnings("unchecked")
  public static void readNode(Element root, String prefix) {
    if (root == null) return;
    // 获取属性
    List<Attribute> attrs = root.getAttributes();
    if (attrs != null && attrs.size() > 0) {
      System.err.print(prefix);
      for (Attribute attr : attrs) {
        System.err.print(attr.getValue() + " ");
      }
      System.err.println();
    }
    // 获取他的子节点
    List<Element> childNodes = root.getChildren();
    prefix += "\t";
    for (Element e : childNodes) {
      readNode(e, prefix);
    }
  } 

  public static void write() {
    boolean validate = false;
    try {
      SAXBuilder builder = new SAXBuilder(validate);
      InputStream in = TestJDom.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.build(in);
      // 获取根节点 <university>
      Element root = doc.getRootElement();
      // 修改属性
      root.setAttribute("name", "tsu");
      // 删除
      boolean isRemoved = root.removeChildren("college");
      System.err.println(isRemoved);
      // 新增
      Element newCollege = new Element("college");
      newCollege.setAttribute("name", "new_college");
      Element newClass = new Element("class");
      newClass.setAttribute("name", "ccccc");
      newCollege.addContent(newClass);
      root.addContent(newCollege);
      XMLOutputter out = new XMLOutputter();
      File file = new File("src/jdom-modify.xml");
      if (file.exists()) {
        file.delete();
      }
      file.createNewFile();
      FileOutputStream fos = new FileOutputStream(file);
      out.output(doc, fos);
    } catch (JDOMException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

}

4、【DOM4j】

dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理

示例代码:

package test.xml; 

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.List; 

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.ProcessingInstruction;
import org.dom4j.VisitorSupport;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; 

/**
 * Dom4j读写xml
 * @author whwang
 */
public class TestDom4j {
  public static void main(String[] args) {
    read1();
    //read2();
    //write();
  } 

  public static void read1() {
    try {
      SAXReader reader = new SAXReader();
      InputStream in = TestDom4j.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = reader.read(in);
      Element root = doc.getRootElement();
      readNode(root, "");
    } catch (DocumentException e) {
      e.printStackTrace();
    }
  } 

  @SuppressWarnings("unchecked")
  public static void readNode(Element root, String prefix) {
    if (root == null) return;
    // 获取属性
    List<Attribute> attrs = root.attributes();
    if (attrs != null && attrs.size() > 0) {
      System.err.print(prefix);
      for (Attribute attr : attrs) {
        System.err.print(attr.getValue() + " ");
      }
      System.err.println();
    }
    // 获取他的子节点
    List<Element> childNodes = root.elements();
    prefix += "\t";
    for (Element e : childNodes) {
      readNode(e, prefix);
    }
  } 

  public static void read2() {
    try {
      SAXReader reader = new SAXReader();
      InputStream in = TestDom4j.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = reader.read(in);
      doc.accept(new MyVistor());
    } catch (DocumentException e) {
      e.printStackTrace();
    }
  } 

  public static void write() {
    try {
      // 创建一个xml文档
      Document doc = DocumentHelper.createDocument();
      Element university = doc.addElement("university");
      university.addAttribute("name", "tsu");
      // 注释
      university.addComment("这个是根节点");
      Element college = university.addElement("college");
      college.addAttribute("name", "cccccc");
      college.setText("text"); 

      File file = new File("src/dom4j-modify.xml");
      if (file.exists()) {
        file.delete();
      }
      file.createNewFile();
      XMLWriter out = new XMLWriter(new FileWriter(file));
      out.write(doc);
      out.flush();
      out.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
} 

class MyVistor extends VisitorSupport {
  public void visit(Attribute node) {
    System.out.println("Attibute: " + node.getName() + "="
        + node.getValue());
  } 

  public void visit(Element node) {
    if (node.isTextOnly()) {
      System.out.println("Element: " + node.getName() + "="
          + node.getText());
    } else {
      System.out.println(node.getName());
    }
  } 

  @Override
  public void visit(ProcessingInstruction node) {
    System.out.println("PI:" + node.getTarget() + " " + node.getText());
  }
}

三、【性能测试】

环境:AMD4400+ 2.0+GHz主频 JDK6.0
运行参数:-Xms400m -Xmx400m
xml文件大小:10.7M
结果:
DOM: >581297ms
SAX: 8829ms
JDOM: 581297ms
DOM4j: 5309ms
时间包括IO的,只是进行了简单的测试,仅供参考!!!!

四、【对比】

1、【DOM】

DOM是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。
优点:
    a、由于整棵树在内存中,因此可以对xml文档随机访问
    b、可以对xml文档进行修改操作
    c、较sax,dom使用也更简单。
缺点:
    a、整个文档必须一次性解析完
    a、由于整个文档都需要载入内存,对于大文档成本高

2、【SAX】

SAX类似流媒体,它基于事件驱动的,因此无需将整个文档载入内存,使用者只需要监听自己感兴趣的事件即可。
优点:
    a、无需将整个xml文档载入内存,因此消耗内存少
    b、可以注册多个ContentHandler
缺点:
    a、不能随机的访问xml中的节点
    b、不能修改文档

3、【JDOM】

JDOM是纯Java的处理XML的API,其API中大量使用Collections类,
优点:
    a、DOM方式的优点
    b、具有SAX的Java规则
缺点
    a、DOM方式的缺点

4、【DOM4J】

这4中xml解析方式中,最优秀的一个,集易用和性能于一身。

五、【小插曲XPath】

XPath 是一门在 XML 文档中查找信息的语言, 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。
XPath非常类似对数据库操作的SQL语言,或者说JQuery,它可以方便开发者抓起文档中需要的东西。(dom4j也支持xpath)

示例代码:

package test.xml; 

import java.io.IOException;
import java.io.InputStream; 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; 

public class TestXPath { 

  public static void main(String[] args) {
    read();
  } 

  public static void read() {
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = dbf.newDocumentBuilder();
      InputStream in = TestXPath.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.parse(in);
      XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      // 选取所有class元素的name属性
      // XPath语法介绍: http://w3school.com.cn/xpath/
      XPathExpression expr = xpath.compile("//class/@name");
      NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
      for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("name = " + nodes.item(i).getNodeValue());
          }
    } catch (XPathExpressionException e) {
      e.printStackTrace();
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

}

六、【补充】

注意4种解析方法对TextNode(文本节点)的处理:

1、在使用DOM时,调用node.getChildNodes()获取该节点的子节点,文本节点也会被当作一个Node来返回,如:


<?xml version="1.0" encoding="UTF-8"?>
<university name="pku">
  <college name="c1">
    <class name="class1">
      <student name="stu1" sex='male' age="21" />
      <student name="stu2" sex='female' age="20" />
      <student name="stu3" sex='female' age="20" />
    </class>
  </college>
</university>
package test.xml; 

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays; 

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; 

/**
 * dom读写xml
 * @author whwang
 */
public class TestDom2 { 

  public static void main(String[] args) {
    read();
  } 

  public static void read() {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {
      DocumentBuilder builder = dbf.newDocumentBuilder();
      InputStream in = TestDom2.class.getClassLoader().getResourceAsStream("test.xml");
      Document doc = builder.parse(in);
      // root <university>
      Element root = doc.getDocumentElement();
      if (root == null) return;
//     System.err.println(root.getAttribute("name"));
      // all college node
      NodeList collegeNodes = root.getChildNodes();
      if (collegeNodes == null) return;
      System.err.println("university子节点数:" + collegeNodes.getLength());
      System.err.println("子节点如下:");
      for(int i = 0; i < collegeNodes.getLength(); i++) {
        Node college = collegeNodes.item(i);
        if (college == null) continue;
        if (college.getNodeType() == Node.ELEMENT_NODE) {
          System.err.println("\t元素节点:" + college.getNodeName());
        } else if (college.getNodeType() == Node.TEXT_NODE) {
          System.err.println("\t文本节点:" + Arrays.toString(college.getTextContent().getBytes()));
        }
      }
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } 

  }
}

输出的结果是:

 university子节点数:3
子节点如下:
  文本节点:[10, 9]
  元素节点:college
  文本节点:[10]

其中\n的ASCII码为10,\t的ASCII码为9。结果让人大吃一惊,university的子节点数不是1,也不是2,而是3,这3个子节点都是谁呢?为了看得更清楚点,把xml文档改为:


<?xml version="1.0" encoding="UTF-8"?>
<university name="pku">11
  <college name="c1">
    <class name="class1">
      <student name="stu1" sex='male' age="21" />
      <student name="stu2" sex='female' age="20" />
      <student name="stu3" sex='female' age="20" />
    </class>
  </college>22
</university>

还是上面的程序,输出结果为:

 university子节点数:3
子节点如下:
  文本节点:[49, 49, 10, 9]
  元素节点:college
  文本节点:[50, 50, 10]

其中数字1的ASCII码为49,数字2的ASCII码为50。

2、使用SAX来解析同DOM,当你重写它的public void characters(char[] ch, int start, int length)方法时,你就能看到。

3、JDOM,调用node.getChildren()只返回子节点,不包括TextNode节点(不管该节点是否有Text信息)。如果要获取该节点的Text信息,可以调用node.getText()方法,该方法返回节点的Text信息,也包括\n\t等特殊字符。

4、DOM4j同JDOM

(0)

相关推荐

  • Java日志相关技术_动力节点Java学院整理

    Java日志相关技术 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统.本文要来分享一些Java程序员最常用的Java日志框架组件. 1.log4j – 最受欢迎的Java日志组件 Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信

  • Javabean简介_动力节点Java学院整理

    一. javabean 是什么? Bean的中文含义是"豆子",顾名思义,JavaBean是指一段特殊的Java类,就是有默然构造方法,只有get,set的方法的java类的对象. 专业点解释是: JavaBean定义了一组规则 JavaBean就是遵循此规则的平常的Java对象 满足这三个条件:   1.执行java.io.Serializable 接口 2.提供无参数的构造器 3.提供getter 和 setter方法访问它的属性. 简单地说,JavaBean是用Java语言描述的

  • Ehcache简介_动力节点Java学院整理

    使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存. CachingFilter功能可以对HTTP响应的内容进行缓存. 1.主要特性 1. 快速.      2. 简单.      3. 多种缓存策略      4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题      5. 缓存数据会在虚拟机重启的过程中写入磁盘      6. 可以通过RMI.可插入API等方式进行分布式缓存      7. 具有缓存和缓存管理器的侦听接口      8. 支持多缓存管理器实例,以

  • tomcat之目录映射_动力节点Java学院整理

    web应用的概念:一个web应用包含了许多我们做好的web资源,里面或许包括了多个静态web资源和动态web资源,如html.css.js文件,jsp文件,Java程序,jar包和配置文件等等,如我在Tomcat的[webapps]目录下的自定义目录[fjdingsdapp]中包含了一个1.html文件,那么这个在[fjdingsdapp]整个可以运行文件中的所有资源可以称为是我开发的一个web应用程序,简称web应用,而单单[fjdingsdapp]这个包含所有我开发的web资源称为我的web

  • Java listener简介_动力节点Java学院整理

    1: 监听器的定义: 监听器实际上是一个类,这个类实现了特定的接口,然后将这个类在 web.xml 文件中进行描述,这样服务器在启动的时候就可以实例化这个类,启动监听器.当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法.例如统计用户在线人数. web监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext,HttpSession,ServletRequest等域对象的创建.销毁.以及属性的变化等,可以在事件发生前.发生后进行一些处理. 2.监听器的用途

  • Java中json使用方法_动力节点Java学院整理

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率). 一.准备工作  json是个非常重要的数据结构,在web开发中应用十分广泛.我觉得每个人都应该好好

  • java解析xml汇总_动力节点Java学院整理

    [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文主要介绍这4种解析XML文档技术的使用.优缺点及性能测试. 一.[基础知识--扫盲] sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的:jaxp只是api,它进一步封装了sax.dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser

  • Java字符编码简介_动力节点Java学院整理

    1. 概述 本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示". 2. 编码基本知识 最早的编码是iso88

  • Java BigDecimal详解_动力节点Java学院整理

    1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合.但是,商业计算往往要求结果精确,例如银行存款数额,这时候BigDecimal就派上大用场啦. 2.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组

  • Java接口的作用_动力节点Java学院整理

    1. 接口是一种规范 很好,你已经知道接口是一种规范了! 下面这张图是我们生活中遇到的接口:电源插座接口. 2. 为什么需要规范呢? 因为有了接口规范: • 任何电器只有有符合规范的插头,就可以获得电力 • 任何厂家(西门子插座,TCL插座,公牛插座...)按照规范进行制作,就能进行供电 每个厂家插座的生产技术.工艺都不一样,因为接口的implementation可以不一样,但是并不影响电器的正常工作.插座的内部实现对于电器来说是完全屏蔽的. 对于软件开发同样也是类似的: • 按照接口规范进行方

  • Java数组的特性_动力节点Java学院整理

    Java中的数组是对象吗? Java和C++都是面向对象的语言.在使用这些语言的时候,我们可以直接使用标准的类库,也可以使用组合和继承等面向对象的特性构建自己的类,并且根据自己构建的类创建对象.那么,我们是不是应该考虑这样一个问题:在面向对象的语言中,数组是对象吗? 要判断数组是不是对象,那么首先明确什么是对象,也就是对象的定义.在较高的层面上,对象是根据某个类创建出来的一个实例,表示某类事物中一个具体的个体.对象具有各种属性,并且具有一些特定的行为.而在较低的层面上,站在计算机的角度,对象就是

  • Java 中HashCode作用_动力节点Java学院整理

    第1 部分 hashCode的作用 Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的.对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代来equals()是否相等.数据量小还可以接受,当我们的数据量大的时候效率可想而知(当然我们可以利用算法进行优化).比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次equals()方法吗?hashCod

  • Xml简介_动力节点Java学院整理

    XML(简介) XML(可扩展标记语言)在 20 世纪 90 年代后期登上舞台后,就一直是众多活动和狂热思索的焦点.XML 只是基于普通文本,但却提供了几乎可以在任何两个应用程序间共享数据的方式. 虽然 XML 在概念上很简单,但对 XML 的处理却通常很烦琐(需要编写大量重复性的代码)和复杂(很多容易被忽视的细节导致错误). 什么时候使用 XML? 什么时候在Web 应用程序中使用 XML? 你需要处理已经保存在 XML 中的数据时. 你希望用 XML 保存数据并为将来可能的整合做准备时.

  • Java Socket编程笔记_动力节点Java学院整理

    对于即时类应用或者即时类的游戏,HTTP协议很多时候无法满足于我们的需求.这会,Socket对于我们来说就非常实用了.下面是本次学习的笔记.主要分异常类型.交互原理.Socket.ServerSocket.多线程这几个方面阐述. 异常类型 在了解Socket的内容之前,先要了解一下涉及到的一些异常类型.以下四种类型都是继承于IOException,所以很多之后直接弹出IOException即可. UnkownHostException:    主机名字或IP错误 ConnectException

  • Java 多线程并发编程_动力节点Java学院整理

    一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理. 线程:表示程序的执行流程,是CPU调度执行的基本单位:线程有自己的程序计数器.寄存器.堆栈和帧.同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源. 2.Java标准库提供了进程和线程相关的API,进程主要包括表示进程的jav

随机推荐