package com.dom4jdemo.test;java
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;node
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Namespace;apache
/**
*
* Project: dom4jDemo
*
* @title com.dom4jDemo.test.Test.java
* @Description: dom4j解析xml的Deml類
* @author 張宇佳
* @created 2016年6月27日 下午1:53:15
*/
@SuppressWarnings("all")
public class Test {
// ////////////////////////////////// XML文檔內容
// /////////////////////////////////////////////////
// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
// <!DOCTYPE Books SYSTEM "books.dtd">
// <Books>
// <book id="a">
// <title>How to Program in JAVA</title>
// <author>James Green</author>
// <price>20</price>
// <publishHouse>清華大學出版社</publishHouse>
// <description>是一本莫須有的書</description>
// </book>
// <book id="b">
// <title>How to Program in C#</title>
// <author>李逍遙</author>
// <price>12</price>
// <publishHouse>清華大學出版社</publishHouse>
// <description>不存在這本書哦</description>
// </book>
// </Books>
// /////////////////////////////////////////////////////////////////////////////////app
/**
*
* @TODO 解析Xml報文
* @author 張宇佳
* @created 2016年6月27日 下午1:53:55
* @version 1.0.0
*/
public static void parseXmlMsg() {
StringBuffer sbf = new StringBuffer();
sbf.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
sbf.append("<Books>");
sbf.append("<book id=\"a\">");
sbf.append("<title>How to Program in JAVA</title>");
sbf.append("<author>James Green</author>");
sbf.append("<price>20</price>");
sbf.append("<publishHouse>清華大學出版社</publishHouse>");
sbf.append("<description>是一本莫須有的書</description>");
sbf.append("</book>");
sbf.append("<book id=\"b\">");
sbf.append("<title>How to Program in C#</title>");
sbf.append("<author>李逍遙</author>");
sbf.append("<price>12</price>");
sbf.append("<publishHouse>清華大學出版社</publishHouse>");
sbf.append("<description>不存在這本書哦</description>");
sbf.append("</book>");
sbf.append("</Books>");
String xmlDocStr = sbf.toString(); // xml報文
Document doc = null;
try {
doc = DocumentHelper.parseText(xmlDocStr); // 將xml報文轉換成xml文檔對象
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Element root = doc.getRootElement(); // 獲取根節點
parseXml(root);
}dom
/**
*
* @TODO 建立Xml文檔並解析
* @author 張宇佳
* @created 2016年6月27日 下午1:54:11
* @version 1.0.0
*/
public static void createDocument() {
Document document = DocumentHelper.createDocument(); // 建立一個XML對象
document.setXMLEncoding("utf-8");
Element rootEle = DocumentHelper.createElement("ROOT"); // 建立根節點
{ // 添加根節點下的第一個子節點
Element cEle = DocumentHelper.createElement("Book");
cEle.setAttributeValue("id", "book1");
// cEle.setText("123");
{ // 添加Book節點下的第一個子節點
Element bookName = DocumentHelper.createElement("name");
bookName.setText("Java");
cEle.add(bookName);
}測試
{ // 添加Book節點下的第二節點
Element bookAuthor = DocumentHelper.createElement("author");
bookAuthor.setText("做者EDG");
cEle.add(bookAuthor);
}spa
{// ..........
Element bookPrice = DocumentHelper.createElement("price");
bookPrice.setText("25");
cEle.add(bookPrice);
}
rootEle.add(cEle); // 添加節點
}
{ // 添加第二個
Element cEle = DocumentHelper.createElement("Book");
cEle.setAttributeValue("id", "book2");
// cEle.setText("123");
{ // 添加Book節點下的第一個子節點
Element bookName = DocumentHelper.createElement("name");
bookName.setText("Maven");
cEle.add(bookName);
}.net
{ // 添加Book節點下的第二節點
Element bookAuthor = DocumentHelper.createElement("author");
bookAuthor.setText("做者RNG");
cEle.add(bookAuthor);
}component
{// ..........
Element bookPrice = DocumentHelper.createElement("price");
bookPrice.setText("160");
cEle.add(bookPrice);
}
rootEle.add(cEle); // 添加節點
}
{// ............
Element cEle = DocumentHelper.createElement("Book");
cEle.setAttributeValue("id", "book3");
// cEle.setText("123");
{ // 添加Book節點下的第一個子節點
Element bookName = DocumentHelper.createElement("name");
bookName.setText("dom4J");
cEle.add(bookName);
}orm
{ // 添加Book節點下的第二節點
Element bookAuthor = DocumentHelper.createElement("author");
bookAuthor.setAttributeValue("id", "author1");
bookAuthor.setText("做者SHR");
cEle.add(bookAuthor);
}
{// ..........
Element bookPrice = DocumentHelper.createElement("price");
bookPrice.setText("122");
cEle.add(bookPrice);
}
rootEle.add(cEle); // 添加節點
}
document.add(rootEle);
String xmlDocStr = document.asXML(); // 將xml文檔對象轉換成字符串對象
System.err.println(xmlDocStr);
System.err
.println("--------------------------------------------------------------------");
// document.selectNodes("");
// xpath表達式 意爲 查找root元素下的book元素下的name元素 過濾 Book元素的屬性id值爲book1
Node node = document.selectSingleNode("/ROOT/Book[@id='book1']/name");
System.err.println(node.getText());
System.err
.println("--------------------------------------------------------------------");
// xpath表達式 意爲 查找root元素下的Book元素 條件 Book元素下的price元素的text值大於80 若返回結果爲多個
// 則返回第一個找到的Book對象,
// 最後面的 .selectSingleNode 意爲 在找到的Book元素對象中查找price對象 , 返回找的第一個元素對象
Node node1 = document.selectSingleNode("/ROOT/Book[price>80]")
.selectSingleNode("price");
System.err.println(node1.getText());
System.out
.println("----------------------------------------- 修改節點包含屬性id=book2的節點爲 id=abcd2 --------------------------------------");
System.out.println("現文檔內容:");
System.out.println(document.asXML());
Element updateEle = getEleByAttr(rootEle, "id", "book2");
Element updatedNode = updateAttr(updateEle, "id", "abcd2");
System.out
.println("---------------------------------------------修改後的文檔內容-------------------------------------------------------");
System.out.println(document.asXML());
System.out
.println("------------------------------------ 開始測試移出節點 --------------------------------");
System.out.println("XML原文檔內容:" + xmlDocStr);
System.out.println("移出Root元素下Book元素下Price>100的第一個price元素節點");
// Node bigNode =
// document.selectSingleNode("/ROOT/Book[price>100]/price");
Node bigNode = document.selectSingleNode("//Book[price>100]/price");
// Node bigNode = document.selectSingleNode("//author[@id='author1']");
System.out.println();
bigNode.getParent().remove(bigNode); // 移出節點
System.out.println("XML現文檔內容:" + document.asXML());
System.out
.println("-----------------------------------------------------將xml寫入xml文件中-------------------------------------------------");
// OutputFormat of = OutputFormat.createCompactFormat(); // 緊湊格式 不排版縮進
OutputFormat of = OutputFormat.createPrettyPrint(); // 縮進格式
of.setEncoding("UTF-8"); // 文中含有中文 設置utf-8字節碼
document.setXMLEncoding("UTF-8");
File file = new File("D:\\JavaCreateDocument.xml");
if (file.exists()) {
file.delete(); // 若是文件已經存在 刪除它
}
XMLWriter out = null;
try {
out = new XMLWriter(new FileOutputStream(file), of);
out.write(document);
out.flush();
out.close();
System.out.println("文件生成成功!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out
.println("----------------------------------------讀取生成的XML文檔------------------------------------------");
parseXmlFile("D:\\JavaCreateDocument.xml");
}
/**
*
* @TODO 讀取解析Xml文件
* @author 張宇佳
* @created 2016年6月27日 下午1:54:26
* @version 1.0.0
*/
public static void parseXmlFile() {
String filePath = "D:\\Books.xml"; // Xml文件路徑
System.err.println("XML文檔路徑:" + filePath);
SAXReader read = new SAXReader();// 獲取一個 文件讀取器
File file = new File(filePath); // 建立一個文件對象
Document doc = null;
try {
// 設置解析XML文檔時忽略DTD文件引用
read.setFeature(
"http://apache.org/xml/features/nonvalidating/load-external-dtd",
false);
// 獲取xml文檔對象
doc = read.read(file);
} catch (Exception e) {
e.printStackTrace();
}
Element root = doc.getRootElement(); // 獲取文檔的根節點
parseXml(root);
}
/**
*
* @TODO 讀取解析Xml文件
* @author 張宇佳
* @created 2016年6月27日 下午1:54:26
* @version 1.0.0
*/
public static void parseXmlFile(String filepath) {
String filePath = "D:\\Books.xml"; // Xml文件路徑
if (filepath != null && !filepath.equals("")) {
filePath = filepath;
}
System.err.println("XML文檔路徑:" + filePath);
SAXReader read = new SAXReader();// 獲取一個 文件讀取器
File file = new File(filePath); // 建立一個文件對象
Document doc = null;
try {
// 設置解析XML文檔時忽略DTD文件引用
read.setFeature(
"http://apache.org/xml/features/nonvalidating/load-external-dtd",
false);
// 獲取xml文檔對象
doc = read.read(file);
} catch (Exception e) {
e.printStackTrace();
}
System.out
.println("---------------------------------------------文檔內容------------------------------------------------");
System.out.println(doc.asXML());
// Element root = doc.getRootElement(); // 獲取文檔的根節點
// parseXml(root);
}
/**
*
* @TODO 測試解析xml
* @author 張宇佳
* @created 2016年6月27日 下午3:15:33
* @param root
* @version 1.0.0
*/
public static void parseXml(Element root) {
Element element = root.element("book"); // 獲取root節點下的子節點
Element elementTitle = element.element("title"); // 獲取element節點下的title節點
Element ele = getEleByAttr(root, "id", "b"); // 根據id=b 獲取root節點下的子節點信息
if (ele != null) { // 已經找到節點
System.err.println("root節點下的具備id=b屬性的節點名字:" + ele.getName()
+ "\n循環子節點:");
Iterator it = ele.elementIterator();
while (it.hasNext()) {
Element e = (Element) it.next();
System.out.println("節點的名字:" + e.getName());
System.out.println("節點中的文字:" + e.getTextTrim());
System.out.println();
}
System.out.println("修改id=b屬性的節點爲id=b1並循環該 遍歷同級別節點");
} else {
System.err.println("未找到節點信息");
}
System.err
.println("------------------------------------------------------------------------");
String nodeText = elementTitle.getTextTrim(); // 獲取節點的文字
System.err.println("book節點的文字:" + nodeText);
List rootChileNodeList = root.elements(); // 獲取某個節點下的子節點集合
Iterator nodesIter = rootChileNodeList.iterator(); // 迭代器
while (nodesIter.hasNext()) { // 遍歷
Element node = (Element) nodesIter.next(); // 其中一個子節點
String nodeTextStr = node.getTextTrim(); // 獲取節點內的文本 並去除兩側的空格
System.err.println("根節點下的子節點包含的文本:" + nodeTextStr);
String nodeName = node.getName(); // 獲取節點的名字
System.err.println("根節點下的子節點名字:" + nodeName);
String nodeAllText = node.getStringValue(); // 獲取節點下的全部String值
System.err.println("根節點下的子節點中的全部String值:" + nodeAllText);
}
}
/**
*
* @TODO 根據屬性值獲取節點
* @author 張宇佳
* @created 2016年6月27日 下午2:44:26
* @param node
* 父節點
* @param attrName
* 屬性名字
* @param attrValue
* 屬性值
* @return 找到的節點對象
* @version 1.0.0
*/
public static Element getEleByAttr(Element node, String attrName,
String attrValue) {
for (Iterator it = node.elementIterator(); it.hasNext();) { // 獲取節點的子節點迭代對象
Element element = (Element) it.next();
Attribute attribute = element.attribute(attrName); // 根據屬性的名字獲取屬性對象
// 值不爲null時表示找到這個屬性
// 不然爲未找到這個屬性
if (attribute != null) {
String value = attribute.getValue(); // 獲取屬性的值
if (value != null && value.equals(attrValue)) {
return element;
} else {
getEleByAttr(element, attrName, attrValue); // 當前節點列表中沒有找到
// 繼續深刻子節點查找
}
}
}
return null;
}
/**
*
* @TODO 修改節點的屬性值
* @author 張宇佳
* @created 2016年6月28日 上午9:26:08
* @param node
* 要修改的元素節點
* @param attrName
* 節點屬性的名字
* @param attrValue
* 修改後的節點屬性值
* @return 修改後的元素節點對象
* @version 1.0.0
*/
public static Element updateAttr(Element node, String attrName,
String attrValue) {
Iterator it = node.attributeIterator(); // 獲取node節點的全部屬性迭代器
while (it.hasNext()) {
Attribute attribute = (Attribute) it.next();
String attrNameTempStr = attribute.getName(); // 獲取該屬性的名字
if (attrNameTempStr != null && attrNameTempStr.equals(attrName)) { // 判斷是否和要修改的屬性名字同樣
attribute.setValue(attrValue); // 設置屬性值
return node;
}
}
return null;
}
/***
*
* @TODO dom4j+Xpath 測試示例 不帶命名空間
* @author 張宇佳
* @created 2016年6月29日 上午10:04:44
* @version 1.0.0
*/
public static void testXpath() {
}
/**
*
* @TODO dom4j+Xpath 測試示例 帶命名空間
* @author 張宇佳
* @created 2016年6月29日 上午10:05:25
* @version 1.0.0
*/
public static void testXpathAndNamespace() throws Exception {
SAXReader reader = new SAXReader();
String filePath = "D:\\applicationContext.xml";
File file= new File(filePath);
Document doc = reader.read(file);
Element rootNode = doc.getRootElement();
Iterator childNodeIter = rootNode.elementIterator();
System.out.println("-------循環根節點下的子節點");
while(childNodeIter.hasNext()){
Element childNode = (Element) childNodeIter.next();
String nodeNameStr = childNode.getName(); // 獲取節點的名字
String prefix = childNode.getNamespacePrefix(); // 獲取節點的命名空間前綴
String nodeTextStr = childNode.getTextTrim(); // 獲取節點內的文字
Iterator childNodePropIter = childNode.attributeIterator();
System.out.println("節點的名字:"+nodeNameStr+ (nodeTextStr.equals("")?"":",節點內的文字:"+nodeTextStr)+ ",節點的屬性:");
System.out.println();
while(childNodePropIter.hasNext()){
Attribute attr = (Attribute) childNodePropIter.next();
String attrName = attr.getName();
String attrValue = attr.getValue();
System.out.print(attrName+" = "+attrValue);
}
System.out.println();
}
System.out.println("-----------------------------------------------XPath獲取節點---------------------------------------------------");
Map nsMap = new HashMap();
List<Namespace> nsList = rootNode.declaredNamespaces(); // 返回這個文檔中聲明的所有命名空間
for (Namespace namespace : nsList) {
String nsKeyStr = namespace.getPrefix(); // 獲得命名空間的簡寫
String nsValueStr = namespace.getURI(); // 獲得命名空間的URI
if(nsKeyStr.equals("")){
nsKeyStr = "ns" ; // 當命名空間的簡稱爲空時 設置爲ns
}
nsMap.put(nsKeyStr, nsValueStr);
}
reader.getDocumentFactory().setXPathNamespaceURIs(nsMap);
Node propNode1 = rootNode.selectSingleNode("//context:component-scan");
Node propNode = rootNode.selectSingleNode("//ns:property");
String propNodeNameStr = propNode.getName();
String propNodeTextStr = propNode.getText();
Iterator propNodeAttrItor = ((Element)propNode).attributeIterator();
System.out.println("屬性:");
while(propNodeAttrItor.hasNext()){
Attribute propNodeAttr = (Attribute) propNodeAttrItor.next();
String attrName = propNodeAttr.getName();
String attrValue = propNodeAttr.getValue();
System.out.print(attrName + " = "+ attrValue + ",");
}
System.out.println("");
}
public static void main(String[] args) throws Exception{
parseXmlFile();
parseXmlMsg();
createDocument();
testXpathAndNamespace();
}
}
示例代碼:
360雲盤 https://yunpan.cn/ckrhe9VDjXy6p 訪問密碼:f9d5