blog迁移至 :http://www.micmiu.com
本文从以下几个基础的方面介绍dom4j操作XML的使用小结:
- [一] 读取XML文件 的示例
- [二] 读取XML字符串 的示例
- [三] 解析XML的document 的示例
- [四] XML编码格式转换 的示例
- [五] 输出格式的自定义 的示例
- [六] XML输出文件的示例
[一]、读取XML文件:
xml示例的文件d:/test/michael/dom4j_info.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root>
读取文件的Java代码如下:
String fileName = "d:/test/michael/dom4j_info.xml";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
System.out.println("document转化为String输出如下:");
System.out.println(document.asXML());
} catch (Exception e) {
e.printStackTrace();
}
document转化为String输出如下: <?xml version="1.0" encoding="UTF-8"?> <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root>
ps:一般默认以XML文件中encoding定义的编码格式读取文件 。
[二]、读取XML字符串:
Java读取String的demo代码:
System.out.println("解析XML字符串DEMO");
String xmlStr = "<root><info index=\"1\" type=\"blog\">"
+ "<URL>http://sjsky.iteye.com</URL>"
+ "<name id=\"sjsky\">Michael</name>"
+ "<categories><category valule=\"java\"/>"
+ "<category valule=\"spring\"/><category valule=\"hibernate\"/>"
+ "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"
+ "</categories></info></root>";
try {
Document document = DocumentHelper.parseText(xmlStr);
System.out.println("document信息输出,默认为UTF-8的编码:");
System.out.println(document.asXML());
} catch (Exception e) {
e.printStackTrace();
}
document信息输出,默认为UTF-8的编码:
<?xml version="1.0" encoding="UTF-8"?>
<root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>
ps:1.默认输出编码为UTF-8
2.输出字符串格式定义参见本文 第[五]部分
[三]、解析XML的Document
/**
* 解析文件
* @blog http://sjsky.iteye.com
* @param fileName
*/
public static void readXMLFile(String fileName) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
readXML(document);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void readXML(Document document) {
try {
System.out.println("开始解析 XML Document:");
// 获取跟节点
Element rootEle = document.getRootElement();
System.out.println("获取跟节点Root:");
System.out.println(rootEle.asXML());
// 根据名称获取Element
Element info = rootEle.element("info");
System.out.println("获取Root下名称为info的子Element:");
System.out.println(info.asXML());
// 根据名称获取List<Element>
List<Element> infolist = rootEle.elements("info");
System.out.println("和上面获取的Element应该一致:");
System.out.println(infolist.get(0).asXML());
// 获取属性值
System.out.println("获取指定属性type的值 = " + info.attributeValue("type"));
// 获取所有的属性值
for (int i = 0; i < info.attributeCount(); i++) {
System.out.println("获取所有的属性和值: " + info.attribute(i).getName()
+ " = " + info.attribute(i).getValue());
}
// XPath的功能展示
Node node1 = document.selectSingleNode("/root/info/name");
System.out.println("根据XPath=/root/info/name获取document下的ELement : "
+ node1.asXML());
Node node2 = rootEle.selectSingleNode("info/name");
System.out.println("根据XPath=info/name 获取root下的ELement : "
+ node2.asXML());
Node node3 = rootEle.selectSingleNode("//info/name");
System.out.println("根据XPath=//info/name 获取root下的ELement : "
+ node3.asXML());
System.out.println("上述三种方式获取的结果应该是一致");
List<?> nodeList = rootEle
.selectNodes("//info/categories/category");
System.out
.println("根据XPath=//info/categories/category获取root下的List:");
for (int i = 0; i < nodeList.size(); i++) {
System.out.println(((Element) nodeList.get(i)).asXML());
}
} catch (Exception e) {
e.printStackTrace();
}
}
开始解析 XML Document: 获取跟节点Root: <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root> 获取Root下名称为info的子Element: <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> 和上面获取的Element应该一致: <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> 获取指定属性type的值 = blog 获取所有的属性和值: index = 1 获取所有的属性和值: type = blog 根据XPath=/root/info/name获取document下的ELement : <name id="sjsky">Michael</name> 根据XPath=info/name 获取root下的ELement : <name id="sjsky">Michael</name> 根据XPath=//info/name 获取root下的ELement : <name id="sjsky">Michael</name> 上述三种方式获取的结果应该是一致 根据XPath=//info/categories/category获取root下的List: <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/>
ps:1. XPath的使用依赖lib包:jaxen.jar
2. XPath的简单介绍说明(以后有机会做个详细介绍)
- nodename 选取此节点的所有子节点(相对路径)
- / 从根节点选取(绝对路径)
- // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
- . 选取当前节点
- .. 选取当前节点的父节点
- @ 选取属性
[四]、XML编码格式转换:
/**
* @blog http://sjsky.iteye.com
* @param args
*/
public static void main(String[] args) {
String xmlStr = "<root><info index=\"1\" type=\"blog\">"
+ "<URL>http://sjsky.iteye.com</URL>"
+ "<name id=\"sjsky\">Michael</name>"
+ "<categories><category valule=\"java\"/>"
+ "<category valule=\"spring\"/><category valule=\"hibernate\"/>"
+ "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"
+ "</categories></info></root>";
System.out.println("XML编码转化DEMO");
try {
Document document = DocumentHelper.parseText(xmlStr);
System.out.println("默认为UTF-8的编码,输出内容如下:");
System.out.println(document.asXML());
System.out.println("编码转化为gb2312后,输出内容如下:");
String encodeStr = encodeXml(xmlStr, "gb2312");
System.out.println(encodeStr);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("DEMO End---------------------");
}
XML编码转化DEMO 默认为UTF-8的编码,输出内容如下: <?xml version="1.0" encoding="UTF-8"?> <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root> 编码转化为gb2312后,输出内容如下: <?xml version="1.0" encoding="gb2312"?> <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root> DEMO End---------------------
[五]、XML输出格式的定义:
- OutputFormat compactFormat = OutputFormat.createCompactFormat(); 紧凑的格式
- OutputFormat prettyFormat = OutputFormat.createPrettyPrint(); 优雅具有层次的格式
/**
* @blog http://sjsky.iteye.com
* @param args
*/
public static void main(String[] args) {
String xmlStr = "<root><info index=\"1\" type=\"blog\">"
+ "<URL>http://sjsky.iteye.com</URL>"
+ "<name id=\"sjsky\">Michael</name>"
+ "<categories><category valule=\"java\"/>"
+ "<category valule=\"spring\"/><category valule=\"hibernate\"/>"
+ "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"
+ "</categories></info></root>";
System.out.println("XML输出格式定义Demo:");
try {
Document document = DocumentHelper.parseText(xmlStr);
System.out.println("转换为优雅层次的格式输出:");
OutputFormat prettyFormat = OutputFormat.createPrettyPrint();
String xmlPretty = xmlOutputFormat(document, prettyFormat);
System.out.println(xmlPretty);
System.out.println("转换为紧凑格式输出:");
OutputFormat compactFormat = OutputFormat.createCompactFormat();
String xmlCompact = xmlOutputFormat(document, compactFormat);
System.out.println(xmlCompact);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("DEMO End---------------------");
}
/**
* XML 输出格式转换
* @param document
* @param opFormat
* @return String
*/
public static String xmlOutputFormat(Document document,
OutputFormat opFormat) {
// 具有层次的格式输出
// OutputFormat format = OutputFormat.createPrettyPrint();
// 紧凑的格式输出
// OutputFormat format = OutputFormat.createCompactFormat();
StringWriter sw = new StringWriter();
try {
XMLWriter writer = new XMLWriter(opFormat);
writer.setWriter(sw);
writer.write(document);
} catch (Exception e) {
e.printStackTrace();
}
return sw.toString();
}
XML输出格式定义Demo: 转换为优雅层次的格式输出: <?xml version="1.0" encoding="UTF-8"?> <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root> 转换为紧凑格式输出: <?xml version="1.0" encoding="UTF-8"?> <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root> DEMO End---------------------
[六]、XML输出文件:
/**
* @blog http://sjsky.iteye.com
* @author Michael
* @param args
*/
public static void main(String[] args) {
String xmlStr = "<root><info index=\"1\" type=\"blog\">"
+ "<URL>http://sjsky.iteye.com</URL>"
+ "<name id=\"sjsky\">Michael</name>"
+ "<categories><category valule=\"java\"/>"
+ "<category valule=\"spring\"/><category valule=\"hibernate\"/>"
+ "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"
+ "</categories></info></root>";
System.out.println("XML输出文件:");
String outFileName = "d:/test/michael/";
try {
Document document = DocumentHelper.parseText(xmlStr);
xmlWriteXMLDoc(outFileName+"dom4j_info_out1.xml", document);
fileWriteXMLDoc(outFileName+"dom4j_info_out2.xml", document);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("DEMO End---------------------");
}
/**
*
* @param fileName
* @param document
*/
public static void xmlWriteXMLDoc(String fileName, Document document) {
XMLWriter writer = null;
try {
//writer = new XMLWriter(new FileWriter(fileName));
//writer = new XMLWriter(new FileWriter(fileName),OutputFormat.createCompactFormat());
writer = new XMLWriter(new FileWriter(fileName),OutputFormat.createPrettyPrint());
writer.write(document);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != writer) {
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
* @param fileName
* @param document
*/
public static void fileWriteXMLDoc(String fileName, Document document) {
FileWriter fw = null;
try {
fw = new FileWriter(fileName);
document.write(fw);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != fw) {
fw.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
生成的dom4j_info_out1.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <info index="1" type="blog"> <URL>http://sjsky.iteye.com</URL> <name id="sjsky">Michael</name> <categories> <category valule="java"/> <category valule="spring"/> <category valule="hibernate"/> <category valule="NoSQL"/> <category valule="MYSQL"/> </categories> </info> </root>
生成的dom4j_info_out2.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>
到此有关dom4j的简单应用基本介绍完了,希望给新接触的tx有所帮助。
本文连接:http://sjsky.iteye.com/blog/1239872
转载请注明来自:Michael's blog @ http://sjsky.iteye.com
----------------------------- 分 ------------------------------ 隔 ------------------------------ 线 ------------------------------