当前位置:编程学习 > JSP >>

Java+XML学习Step by step(一)

答案: Belltree 发表于 2001-10-25 09:08 XML学习 ←返回版面     

啊,各位兄弟,找了几个jaxp和xerces的例子,做了一些注释,希望对大家的学习有帮助,下面这个例子是jaxp包中带的例子:CountDom.java,这个例子要点有:如何得到一个Document对象,以及对节点类型的判断。可以看到,jaxp程序都从得到一个DocumentBuilderFactory实例开始,再从中获得DocumentBuilder实例,DocumentBuilder实例就可以新建一个空的Document或者parse一个已有的xml文档。

/*
* 使用DOM方法来遍历XML树中的所有节点,对节点类型为ELEMENT的进行统计
*/
import java.io.*;

// import JAXP包
import org.w3c.dom.*;   // 这个里面主要定义了一系列的Inte易做图ce

import org.xml.sax.*;   // 为什么要载入这个包呢,我认为是因为要抛出异常,解析XML的异常在SAX中
                        // 都定义好了,所以DOM就直接用了

import javax.xml.parsers.DocumentBuilderFactory;  // factory API,用来获得一个parser
import javax.xml.parsers.DocumentBuilder;         // 用来从XML文档中获得DOM文档实例

public class CountDom {

  /* main函数,这个就不用讲了,调用getElementCount(),arg参数就是要处理的xml文件名 */
  public static void main(String[] args) throws Exception {
    for (int i = 0; i < args.length; i++) {
      String arg = args[i];
      System.out.println(arg + " elementCount: " + getElementCount(arg));
    }
  }

  /* 调用 getElementCount(Node),Node是节点 */
  public static int getElementCount(String fileName) throws Exception {
    Node node = readFile(fileName);   // readFile(String)获得一个文件实例
                                      // readFile(File)返回Document
    return getElementCount(node);     // 统计Elements
  }

  /* 创建文件对象, 调用 readFile(File) */
  public static Document readFile(String fileName) throws Exception {
    if (null == fileName) {
      throw new Exception("no fileName for readFile()");
    }
    return readFile(new File(fileName));
  }

  /* 解析文档,返回 Document */
  public static Document readFile(File file) throws Exception {
    Document doc;
    try {
      /* 首先获得一个 DocumentBuilderFactory 的实例 */
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      
      /* 下面看是不是要对xml文档进行有效性判断,缺省是false */
      // dbf.setValidating(true);
          
      /* 创建一个 DocumentBuilder 的实例*/
      DocumentBuilder db = dbf.newDocumentBuilder();
          
      /* 解析文档 */
      doc = db.parse(file);
      
      /* 返回一个 Document 实例*/
      return doc;
    } catch (SAXParseException ex) {
      throw (ex);
    } catch (SAXException ex) {
      Exception x = ex.getException();   // get underlying Exception
      throw ((x == null) ? ex : x);
    }
  }

  /*
   * 使用DOM方法来统计 ELEMENTS
   */
  public static int getElementCount(Node node) {
    /* 如果node为空的话,然回0 */
    if (null == node) {
      return 0;
    }
    int sum = 0;
    // 首先,第一个是节点的根,判断一下是不是ELEMENT
    boolean isElement = (node.getNodeType() == Node.ELEMENT_NODE);
    // 如果节点的根是ELEMENT节点,那sum的初始值就是1
    if (isElement) {
      sum = 1;
    }
    // 发挥节点的所有子节点
    NodeList children = node.getChildNodes();
        
    // 没有任何子节点的情况下,返回当前值
    if (null == children) {
      return sum;
    }
    // 遍历节点的所有子节点
    for (int i = 0; i < children.getLength(); i++) {
      //用递归
      sum += getElementCount(children.item(i));
    }
    return sum;
  }
}


上一个:一个关于SOAP的邮件列表
下一个:关于SOAP反序列化的一点认识,正好解释了问题所在

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,