利用JDOM解析XML文件

来源:互联网 发布:社会和学校的区别知乎 编辑:程序博客网 时间:2024/05/21 18:45

 package text;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author Admin 利用JDOM解析XML文件
 */
public class TestXML {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Document doc;
  DocumentBuilderFactory factory;
  DocumentBuilder docBuilder;
  String elementName;
  Element root;
  String fileName;
  FileInputStream in;
  fileName = System.getProperty("user.dir");
  fileName = fileName + "/src/sample.xml";

  try {
   in = new FileInputStream(fileName);
   // 解析XML文件生成Document对象
   factory = DocumentBuilderFactory.newInstance();
   factory.setValidating(false);
   try {
    docBuilder = factory.newDocumentBuilder();
    try {
     doc = docBuilder.parse(in);
     // 解析成功
     System.out.println("解析成功!");
     // 获取XML文件的根节点
     root = doc.getDocumentElement();
     elementName = root.getNodeName();
     // 打印根节点的属性
     printAttribute(root);
     // 打印该文档的全部节点
     System.out.println("打印该文档的全部节点");
     printElement(root, 0);
    } catch (SAXException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 /**
  * 打印某个节点的全部属性
  *
  * @param root
  */
 public static void printAttribute(Element root) {

  NamedNodeMap attributes;
  int i, max;
  String name, value;
  Node curCode;
  attributes = root.getAttributes();
  max = attributes.getLength();

  for (i = 0; i < max; i++) {
   curCode = attributes.item(i);
   name = curCode.getNodeName();
   value = curCode.getNodeValue();
   System.out.print(name + " = " + value);
   System.out.println();
  }
  
 }

 /**
  * 打印所有节点的名和值 该方法使用的是递归方式打印文档的全部节点
  *
  * @param root
  * @param depth
  */
 public static void printElement(Element elem, int depth) {
  String elementName;
  NodeList children;
  int i, max;
  Node curChild;
  Element curElement;
  String nodeName, nodeValue;
  // 获取输入节点的全部子节点
  children = elem.getChildNodes();
  // 按一定格式打印输入节点
  for (int j = 0; j < depth; j++) {
   System.out.println(" ");
  }
  printAttribute(elem);
  // 采用递归方式打印全部子节点
  max = children.getLength();
  for (i = 0; i < max; i++) {
   curChild = children.item(i);
   // 递归退出条件
   if (curChild instanceof Element) {
    curElement = (Element) curChild;
    printElement(curElement, depth + 1);
   } else {
    nodeName = curChild.getNodeName();
    nodeValue = curChild.getNodeValue();
    for (int j = 0; j < depth; j++) {
     System.out.println("");
    }
    if (nodeValue.equals("") || nodeValue == null) {

    } else {
     System.out.print(nodeName + " = " + nodeValue);
    }
    System.out.println();
   }
  }
 }
}

原创粉丝点击