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();
}
}
}
}