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:Domain.java
*@DATE 2008-02-03
*
*/
public class Domain
{
/**
* 定义xml编码方式
*/
public static final String ENCODING_GBK="GBK";
public static final String ENCODING_UTF8="UTF-8";
public static final String ENCODING_UTF16="UTF-16";
public static final String ENCODING_GB2312="gb2312";
public static final String ENCODING_ISO8859="ISO8859-1";
private static Format format=Format.getPrettyFormat();
static{
format.setEncoding(ENCODING_UTF8);
}
/**
* 通过给定的xml文件名来读取并且解析它
*@param filepath要解析的xml文件路径
*@return the JDOM document parsed from thd file.
*@throws IOException
*
*/
public static Document readDocument(String filePath)throws IOException
{
try{
SAXBuilder builder=new SAXBuilder(false);
Document doc=builder.build(new File(filePath));
return doc;
}catch(Exception ex){
ex.printStackTrace();
throw new IOException(ex.getMessage());
}
}
/**
* 通过InputStream来读取并且解析它
*@param input 输入流
*@return the JDOM document parsed from thd file.
*@throws IOException
*
*/
public static Document readDocument(InputStream inputStream)throws IOException
{
try{
SAXBuilder builder=new SAXBuilder(false);
Document doc=builder.build(inputStream);
return doc;
}catch(Exception ex){
ex.printStackTrace();
throw new IOException(ex.getMessage());
}
}
/**
*读取xml文件
*@param srcFile 目标文件
*@return the JDOM document parsed from thd file.
*@throws IOException
*
*/
public static Document readDocument(File srcFile)throws IOException
{
try{
SAXBuilder builder=new SAXBuilder(false);
Document doc=builder.build(srcFile);
return doc;
}catch(Exception ex){
ex.printStackTrace();
throw new IOException(ex.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 ex){
ex.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 ex){
ex.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 ex){
ex.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 ex){
ex.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,ENCODING_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,ENCODING_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 = Domain.readDocument("test.xml");
//根据元素的属性值删除结点
//Domain.removeChildElement(doc,"books/book","love","fef");
//增加一个元素
Element e=new Element("title");
e.setAttribute("id","1");
e.setText("dddd");
List shapes = Domain.getChildrenElement(doc, "books/book");
for(int i=0;i<shapes.size();i++){
System.out.println(Domain.getChildElement(shapes.get(i), "name").getText());
}
Domain.outputDocument(doc);
}
}