位置:海鸟网 > IT > XML >

用DOM/JDOM解析XML文件(3)

以前记录过两个自己写的读写XML文件的帖子,感觉很不完善,只适合简单的应用,无法完成更复杂高级的功能。最近正好用到一个更优雅的,再记录下来,以备以后查阅。
  越来越喜欢用“优雅”这个词来形容一段好的代码,没有什么好的理由,就是感觉挺好。喜欢一个词需要理由吗?喜欢一个东西需要理由吗?喜欢一个人需要理由吗?……

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

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;

/**
* Jdom解析XML
*
* @FileName:XMLUtil.java
* @author Javer.Leo (QQ:84831612)
* @date 2006-8-16
*/
public final class XMLUtil
{
/**
* 定义xml编码方式
*/
public static final String ENCODE_GBK = "GBK";
public static final String ENCODE_UTF8 = "UTF-8";
public static final String ENCODE_UTF16 = "UTF-16";
public static final String ENCODE_GB2312 = "gb2312";
public static final String ENCODE_ISO8859 = "ISO8859-1";

private static Format format = Format.getPrettyFormat();

static {
format.setEncoding(ENCODE_UTF8);
}

/**
* Read and parse an xml document from the file at xml/sample.xml.
* This method corresponds to the code in Listing 7.
* @param filePath 要解析的xml文件路径
* @return the JDOM document parsed from the file.
* @throws IOException
*/
public static Document readDocument(String filePath) throws IOException {
try {
SAXBuilder builder = new SAXBuilder(false);
Document anotherDocument = builder.build(new File(filePath));
return anotherDocument;
} catch(Exception e) {
e.printStackTrace();
throw new IOException(e.getMessage());
}
}

/**
* Read and parse an xml document from the file at xml/sample.xml.
* This method corresponds to the code in Listing 7.
* @param filePath 要解析的xml文件路径
* @return the JDOM document parsed from the file.
* @throws IOException
*/
public static Document readDocument(InputStream input) throws IOException {
try {
SAXBuilder builder = new SAXBuilder(false);
Document anotherDocument = builder.build(input);
input.close();
return anotherDocument;
} catch(Exception e) {
throw new IOException(e.getMessage());
}
}

/**
* 读取xml文件
* @param srcFile 目标文件
* @return DOM对象
* @throws IOException
*/
public static Document readDocument(File srcFile) throws IOException {
try {
SAXBuilder builder = new SAXBuilder();
Document anotherDocument = builder.build(srcFile);
return anotherDocument;
} catch(Exception e) {
throw new IOException(e.getMessage());
}
}

/**
* 向指定的文档模型添加指定元素标识名称的元素
* @param document 要添加元素的文档模型
* @param elementName 要添加的元素标识名称
* @param parentElementPath 父元素路径
* @return
*/
public static void addElement(Object document,String parentElementPath,String elementName){
try{
Element parentElement;
parentElement = (Element)XPath.selectSingleNode(document,parentElementPath);
Element newElement = new Element(elementName);
parentElement.addContent(newElement);
} catch (Exception e1) {
e1.printStackTrace();
}
}

/**
* 向指定的文档模型添加已创建元素
* @param document 要添加元素的文档模型
* @param newElement 要添加的新元素
* @param parentElementPath 父元素路径
* @return
*/
public static void addElement(Object document,String parentElementPath,Element newElement){
try{
Element parentElement;
parentElement = (Element)XPath.selectSingleNode(document,parentElementPath);
parentElement.addContent(newElement);
} catch (Exception e1) {
e1.printStackTrace();
}
}

/**
* 获取指定子元素路径的子元素列表
* @param document the JDOM document built from Listing 2
* @param visitedNodeName 指定要访问的子节点元素名称
* @return 返回指定元素路径的子元素列表
*/
public static List getChildrenElement(Object document,String visitedNodeName) {
List visitElements = null;
try {
visitElements = XPath.selectNodes(document,visitedNodeName);
} catch (Exception e) {
e.printStackTrace();
}
return visitElements;
}

/**
* 获取指定子元素路径名称和属性名称及值的元素
* @param document the JDOM document built from Listing 2
* @param visitedNodeName 指定要访问的子节点元素名称
* @param attributeName 属性名称
* @param attributeValue 属性值
* @return 返回指定的元素
*/
public static Element getChildElement(Object document,String visitedNodeName,String attributeName,String attributeValue) {
Element visitElement = null;
try {
visitElement = (Element)XPath.selectSingleNode(document,visitedNodeName+"[@"+attributeName+"='"+attributeValue+"']");
} catch (Exception e) {
e.printStackTrace();
}
return visitElement;
}

/**
* 获取指定子元素路径名称和属性名称及值的元素
* @param document the JDOM document built from Listing 2
* @param visitedNodeName 指定要访问的子节点元素名称
* @return 返回指定的元素
*/
public static Element getChildElement(Object document,String visitedNodeName) {
Element visitElement = null;
try {
visitElement = (Element)XPath.selectSingleNode(document,visitedNodeName);
} catch (Exception e) {
e.printStackTrace();
}
return visitElement;
}

/**
* 删除指定元素节点路径的元素
* @param removeNodeName 要删除的元素路径
* @param document xml文件对应的文档模型
*/
public static boolean removeChildElement(Object document,String removeNodeName) {
Element visitElement = null;
boolean isRemoved = false;
try {
visitElement = (Element)XPath.selectSingleNode(document,removeNodeName);
if(visitElement != null)
isRemoved = visitElement.getParentElement().removeContent(visitElement);
} catch (Exception e) {
e.printStackTrace();
}
return isRemoved;
}

/**
* 删除指定属性的元素
* @param document xml文件对应的文档模型
* @param removeNodeName 要删除的节点元素路径
* @param attributeName 属性名称
* @param attributeValue 属性值
* @return
*/
public static boolean removeChildElement(Object document,String removeNodeName ,String attributeName,String attributeValue) {
List removeElements = null;
Element visitElement = null;
boolean isRemoved = false;
try {
removeElements = XPath.selectNodes(document,removeNodeName+"[@"+attributeName+"='"+attributeValue+"']");
if(removeElements != null){
for (int i = 0; i < removeElements.size(); i++) {
visitElement = (Element) removeElements.get(i);
isRemoved = visitElement.getParentElement().removeContent(visitElement);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return isRemoved;
}

/**
* 将xml文档模型输出到标准输出设备(屏幕)
* @param document 指定的xml文档模型
*/
public static void outputDocument(Document document) {
format.setIndent(" ");
format.setExpandEmptyElements(false);
try {
XMLOutputter outputter = new XMLOutputter(format);
outputter.output(document, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 将xml文档模型输出到标准输出设备(流)
* @param document 指定的xml文档模型
*/
public static void outputDocument(Document document,OutputStream output) {
format.setIndent(" ");
format.setExpandEmptyElements(false);
try {
XMLOutputter outputter = new XMLOutputter(format);
outputter.output(document, output);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 将xml文档模型输出到指定文件
* @param document 指定的xml文档模型
* @param outputFilePath 输出文件路径
*/
public static void outputDocumentToFile(Document document,String outputFilePath) {
outputDocumentToFile(document,outputFilePath,ENCODE_GB2312);
}

/**
* 将xml文档模型输出到指定文件
* @param document 指定的xml文档模型
* @param outputFilePath 输出文件路径
* @param encodingMode 编码方式
*/
public static void outputDocumentToFile(Document document,String outputFilePath,String encodingMode) {
format.setEncoding(encodingMode);
format.setIndent(" ");
format.setExpandEmptyElements(false);
FileWriter writer = null;

try {
XMLOutputter outputter = new XMLOutputter(format);
writer = new FileWriter(outputFilePath);
outputter.output(document, writer);
writer.close();

}catch(Exception ep) {
ep.printStackTrace();
}
finally{
try {
if(writer != null)
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

/**
* 将将xml文档模型输出到指定字符串
* @param document 指定的xml文档模型
* @return 返回document的内容
*/
public static String outputDocumentString(Document document){

return outputDocumentString(document,ENCODE_GBK);
}

/**
* 将将xml文档模型输出到指定字符串
* @param document 指定的xml文档模型
* @param encodingMode 编码格式
* @return 返回document的内容
*/
public static String outputDocumentString(Document document,String encodingMode){
format.setEncoding(encodingMode);
format.setIndent(" ");
format.setExpandEmptyElements(false);
XMLOutputter outputter = new XMLOutputter(format);
return outputter.outputString(document);
}

/**
* This method takes a JDOM document in memory, an xsl file at xml/car.xsl,
* and outputs the results to stdout.
* This method corresponds to Listing 9.
* @param myDocument the JDOM document built from Listing 2.
*/
// public static void executeXSL(Document myDocument) {
// try {
// TransformerFactory tFactory = TransformerFactory.newInstance();
// // Make the input sources for the XML and XSLT documents
// org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
// org.w3c.dom.Document domDocument = outputter.output(myDocument);
// javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument);
// StreamSource xsltSource = new StreamSource(new FileInputStream("car.xsl"));
// //Make the output result for the finished document
// /*
// * Note that here we are just going to output the results to the
// * System.out, since we don't actually have a HTTPResponse object
// * in this example
// */
// //StreamResult xmlResult = new StreamResult(response.getOutputStream());
// StreamResult xmlResult = new StreamResult(System.out);
// //Get a XSLT transformer
// Transformer transformer = tFactory.newTransformer(xsltSource);
// //do the transform
// transformer.transform(xmlSource, xmlResult);
// } catch(FileNotFoundException e) {
// e.printStackTrace();
// } catch(TransformerConfigurationException e) {
// e.printStackTrace();
// } catch(TransformerException e) {
// e.printStackTrace();
// } catch(org.jdom.JDOMException e) {
// e.printStackTrace();
// }
// }

/**
* 修改指定节点元素的属性
* @param document
* @param nodePath
* @param name
* @param value
*/
public static void setElementAttributeValue(Object document,String nodePath,String name,String value){
try {
((Element)XPath.selectSingleNode(document,nodePath)).setAttribute(name,value);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 修改指定节点元素的属性
* @param document
* @param nodePath
* @param attrName
* @param attrValue
* @param name
* @param value
*/
public static void setElementAttributeValue(Object document,String nodePath,String attrName,String attrValue,String name,String value){
nodePath +="[@" + attrName + "='" + attrValue + "']";
setElementAttributeValue(document,nodePath,name,value);
}
/**
* 修改指定节点元素的内容
* @param document
* @param nodePath
* @param text
*/
public static void setElementText(Object document,String nodePath,String text){
try {
((Element)XPath.selectSingleNode(document,nodePath)).setText(text);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 修改指定节点元素的内容
* @param document
* @param nodePath
* @param attrName
* @param attrValue
* @param text
*/
public static void setElementText(Object document,String nodePath,String attrName,String attrValue,String text){
nodePath +="[@" + attrName + "='" + attrValue + "']";
setElementText(document,nodePath,text);
}

/**
* 设置xml的编码格式
* @param encode
*/
public static void setEncoding(String encode){
format.setEncoding(encode);

}

/**
* 用DTD文档类型定义校验xml文档
* @param content
* @return
*/
// public static boolean validate(){
// SAXBuilder builder = new SAXBuilder(true);
// try{
// // Jdom complains about the document even though it is valid
// ByteArrayInputStream bais=new ByteArrayInputStream(content.getBytes());
// builder.build(bais);
// return true;
//
// } catch (Exception e) {
//
// return false;
//
// }
//
// }

public static void main(String[] args) throws Exception
{
Document doc = XMLUtil.readDocument("test.xml");
List shapes = XMLUtil.getChildrenElement(doc, "javer/leo/example");
for(int i=0;i {
System.out.println(XMLUtil.getChildElement(shapes.get(i), "id").getText());
}
}
}