一 常用api
1.1 SAXReader類的方法
/**
* 擷取Document 文檔
* @param file
* @return org.dom4j.Document
* @author feizhou
* @since 2020/9/6 22:47
*/
public static Document getDocument(File file) throws DocumentException {
// 建立xml解析器
SAXReader saxReader = new SAXReader();
// 加載目标檔案
Document doc = saxReader.read(file);
return doc;
}
1.2 Document接口的方法
public class DOM4JTest2 {
private static String path = "D:\\java\\workSpace\\git\\learnDemo\\src\\main\\java\\com\\example\\demolearn\\other\\jdkClass\\dom4j\\";
public static void main(String[] args) throws Exception {
// 建立xml解析器
SAXReader saxReader = new SAXReader();
// 加載目标檔案
Document doc = saxReader.read(new File(path + "01.xml"));
Element rootElement = doc.getRootElement();
System.out.println("根元素名稱:" + rootElement.getName());
}
}
1.3 Element接口的方法
Element addAttribute(String name, String value);//通過屬性名和值添加屬性
Element addComment(String comment);//添加評論
Element addText(String text);//添加元素标簽值
void add(Attribute attribute);//直接添加屬性
boolean remove(Attribute attribute);//删除屬性
String getText();//擷取元素的标簽值
String elementText(String name);//擷取元素的标簽值
String getTextTrim();//擷取元素的标簽值并會忽略文本2端的空白字元
List attributes(); //擷取屬性集合
int attributeCount();//擷取屬性個數
Iterator attributeIterator();//擷取屬性集合疊代器
String attributeValue(String name);//擷取某個屬性的值
Element element(String name);//擷取第一個子元素
List elements();//擷取子元素集合
Iterator elementIterator();//擷取子元素集合的疊代器
boolean isRootElement();//查詢是否是根元素
剩下的就是繼承他父接口Node的方法了
1.4 Attribute接口的方法
getName:擷取屬性的名字,其實是繼承其父接口Node的方法
getValue:擷取屬性的值
1.5 OutputFormat類
OutputFormat createPrettyPrint();//輸出漂亮的格式
OutputFormat createCompactFormat() ;//輸出緊湊的格式
setEncoding(String encoding) ;//指定輸出格式
二 demo
2.1 列印所有元素
2.1.1 列印所有元素
package com.example.demolearn.other.jdkClass.dom4j;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* dom4j的使用和分析
*
*/
public class DOM4JTest2 {
private static String path = "D:\\java\\workSpace\\git\\learnDemo\\src\\main\\java\\com\\example\\demolearn\\other\\jdkClass\\dom4j\\";
public static void main(String[] args) throws Exception {
test1();
}
/**
* 列印所有01.xml資訊
*/
public static void test1() throws Exception {
// 建立xml解析器
SAXReader saxReader = new SAXReader();
// 加載目标檔案
Document doc = saxReader.read(new File(path + "01.xml"));
// 擷取根元素
Element root = doc.getRootElement();
getAllElement(root);
}
/**
* 顯示所有屬性
*
* @param e
* @return void
* @author feizhou
* @since 2020/9/6 22:44
*/
public static void getAllElement(Element e) {
if (e.elements().size() > 0) {
for (Element element : e.elements()) {
getAllElement(element);
}
} else {
System.out.println("----------------------");
System.out.println("元素名稱:" + e.getName());
Iterator<Attribute> it = e.attributeIterator();
while (it.hasNext()) {
Attribute attr = it.next();
System.out.println("元素屬性:" + attr.getName() + "=" + attr.getValue());
}
}
}
}
2.1.2 列印所有元素
package com.example.demolearn.other.jdkClass.dom4j;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
/**
* dom4j的使用和分析
*
*/
public class DOM4JTest3 {
private static String path = "D:\\java\\workSpace\\git\\learnDemo\\src\\main\\java\\com\\example\\demolearn\\other\\jdkClass\\dom4j\\";
public static void main(String[] args) throws Exception {
test1();
}
/**
* 列印所有01.xml資訊
*/
public static void test1() throws Exception {
// 建立xml解析器
SAXReader saxReader = new SAXReader();
// 加載目标檔案
Document doc = saxReader.read(new File(path + "01.xml"));
// 擷取根元素
Element root = doc.getRootElement();
getAllElement(root);
}
/**
* 顯示所有屬性
*
* @return void
* @author feizhou
* @since 2020/9/6 22:44
*/
public static void getAllElement(Element e1) {
// 擷取根元素的所有直接子節點
Iterator<Node> it1 = e1.nodeIterator();
while (it1.hasNext()) {
Node node = it1.next();
if (node instanceof Comment) {// 注釋
System.out.println("注釋内容" + node.getText());
continue;
}
if (node instanceof Element) {// 标簽
System.out.println("---------");
System.out.println("标簽名字:" + node.getName());
Element e2 = (Element) node;
Iterator<Attribute> attributes = e2.attributeIterator();
while (attributes.hasNext()) {
Attribute attr = attributes.next();
System.out.println("元素屬性:" + attr.getName() + "=" + attr.getValue());
}
if (e2.elements().size() > 0) {
getAllElement(e2);
}
continue;
}
}
}
}
輸出:
---------
标簽名字:students
---------
标簽名字:student
元素屬性:name=張三
元素屬性:location=河南
元素屬性:age=18
---------
标簽名字:teachers
---------
标簽名字:teacher
元素屬性:name=zzs
元素屬性:location=河南
元素屬性:age=18
---------
标簽名字:teacher
元素屬性:name=zzf
元素屬性:location=新疆
元素屬性:age=26
2.1.3 把xml檔案的所有标簽名名字、屬性、标簽體、注釋、空白處 等…的内容全部列印出來,格式要求與xml檔案的内容。
package com.example.demolearn.other.jdkClass.dom4j;
import java.io.File;
import java.util.Iterator;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
/**
* dom4j的使用和分析
*
*/
public class DOM4JTest3 {
private static String path = "D:\\java\\workSpace\\git\\learnDemo\\src\\main\\java\\com\\example\\demolearn\\other\\jdkClass\\dom4j\\";
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File(path + "01.xml"));
Element root = doc.getRootElement();
StringBuilder sb = new StringBuilder();
readXml(root, sb);
System.out.println(sb);
}
// 把xml檔案的所有标簽名名字、屬性、标簽體、注釋、空白處 等...的内容全部列印出來,格式要求與xml檔案的内容。
public static void readXml(Element element, StringBuilder sb) {
sb.append("<" + element.getName());
// 擷取到屬性疊代器添加所有的屬性
Iterator<Attribute> attriIt = element.attributeIterator();
while (attriIt.hasNext()) {
Attribute attribute = attriIt.next();
sb.append(" " + attribute.getName() + "=\"" + attribute.getValue() + "\"");
}
// 添加結束開始标簽的符号
sb.append(">");
// 擷取所有的子節點
Iterator<Node> it = element.nodeIterator();
while (it.hasNext()) {
Node node = it.next();
if (node instanceof Text) {
// 文本
sb.append(node.getText());
} else if (node instanceof Comment) {
// 注釋
sb.append("<!--" + node.getText() + "-->");
} else if (node instanceof Element) {
// 疊代讀取下一個元素
readXml((Element) node, sb);
}
}
// 添加結束标簽
sb.append("</" + element.getName() + ">");
}
}
輸出:
<members>
<students>
<student name="張三" location="河南" age="18"></student>
</students>
<teachers>
<teacher name="zzs" location="河南" age="18"></teacher>
<teacher name="zzf" location="新疆" age="26"></teacher>
</teachers>
</members>
2.2 建立xml
package com.example.demolearn.other.jdkClass.dom4j;
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
/**
* dom4j的使用和分析
*
*/
public class DOM4JTest3 {
private static String path = "D:\\java\\workSpace\\git\\learnDemo\\src\\main\\java\\com\\example\\demolearn\\other\\jdkClass\\dom4j\\";
public static void main(String[] args) throws Exception {
// 建立一個Document執行個體
Document doc = DocumentHelper.createDocument();
// 添加根節點
Element root = doc.addElement("members");
// 在根節點下添加第1個子節點
Element students = root.addElement("students");
students.addElement("student").addAttribute("age", "18").addAttribute("location", "河南").addAttribute("name",
"張三");
// 在根節點下添加第2個子節點
Element teachers = root.addElement("teachers");
teachers.addElement("teacher").addAttribute("age", "18").addAttribute("location", "河南").addAttribute("name",
"zzs");
teachers.addElement("teacher").addAttribute("age", "26").addAttribute("location", "新疆").addAttribute("name",
"zzf");
// xml格式化樣式
// OutputFormat format = OutputFormat.createPrettyPrint(); // 預設樣式
// 自定義xml樣式
OutputFormat format = new OutputFormat();
format.setIndentSize(2); // 行縮進
format.setNewlines(true); // 一個結點為一行
format.setTrimText(true); // 去重空格
format.setPadText(true);
format.setNewLineAfterDeclaration(false); // 放置xml檔案中第二行為空白行
// 輸出xml檔案
XMLWriter writer = new XMLWriter(new FileOutputStream(new File(path + "03.xml")), format);
writer.write(doc);
}
}