package cn.com.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;
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);
}
/**
* 修改指定节点元素的属性
*
* @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 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 < 8; i++) {
System.out.println(XMLUtil.getChildElement(shapes.get(i), "id")
.getText());
}
}
}