Heim  >  Artikel  >  Backend-Entwicklung  >  XML-Programmierung-DOM4J

XML-Programmierung-DOM4J

黄舟
黄舟Original
2017-02-20 15:13:521341Durchsuche

XMLProgrammierung-DOM4J

Grundlagen Übersicht


dom4j ist eineJavaXML-API , ähnlich zu jdom, wird zum Lesen und Schreiben von XML-Dateien verwendet. dom4j ist eine sehr hervorragende JavaXML-API, die sich durch hervorragende Leistung, leistungsstarke Funktionen und äußerst einfache Bedienung auszeichnet ebenfalls eine Open-Source-Software, Sie finden sie unter SourceForge. Sie können auch einen Artikel auf IBM DeveloperWorks über die Leistung, Funktionalität und Benutzerfreundlichkeit der gängigen Java XML API-Rezensionen finden. So können Sie sicher sein, dass dom4j in jeder Hinsicht hervorragend ist. Heute können wir sehen, dass immer mehr Java-Software dom4j zum Lesen und Schreiben von XML, besonders erwähnenswert ist, dass sogar Suns JAXM auch dom4j verwendet . Dies ist bereits ein unbedingt zu verwendendes jar-Paket, das auch von Hibernate zum Lesen und Schreiben von Konfigurationsdateien verwendet wird. PS

:

DOM4J Einer der Gründe, warum es so leistungsstark ist, ist, dass es XPath unterstützt Technologie, DOM4J verfügt auch über entsprechende Referenzdokumente, die Sie bei Bedarf selbst durchsuchen und herunterladen können.

Warum gibt es

DOM4J

? Die beiden zuvor im Blog beschriebenen Technologien DOM

und SAX haben den Nachteil der ersteren Der Nachteil des letzteren besteht darin, dass er nur Lesevorgänge ausführen kann, während DOM4J sowohl Effizienz liefern als auch Crud Operationen . PS: Um

DOM4J zu verwenden, müssen Sie das entsprechende Basis-JAR-Paket: Wenn Sie die Erweiterungsfunktion von DOM4J verwenden, müssen Sie auch das Erweiterungspaket JAR importieren.

DOM4JErste Schritte

DOM4JDrei Methoden zum Abrufen des Dokumentobjekts

1.XML-Datei lesen, DokumentObjekt erhalten(Häufig verwendet)

    SAXReader reader = new SAXReader();
    Document   document = reader.read(new File(“src/input.xml"));

2.Parsen Sie XML-Text in der Form , , um DokumentObjekt

    String text = "<members></members>";
    Document document = DocumentHelper.parseText(text);
3.

Aktiv DokumentObjekt

    Document document = DocumentHelper.createDocument();
    //创建根节点
    Element root = document.addElement("members");
PS

: Stellen Sie sicher, dass Sie das entsprechende JAR-Paket importieren.



Knotenobjekt

1

, holen Sie sich den Stammknoten des Dokuments

    Element root = document.getRootElement();



2

, holen Sie sich den untergeordneten Knoten eines Knotens



3
    Element element=node.element(“书名");
, den Inhalt des Knotens abrufen

4
    String text1=node.getText();
    String text2=node.getTextTrim();	// 去掉内容前面和后面的空格
, Holen Sie sich den Inhalt eines Knotens. Alle untergeordneten Knoten mit dem Namen „

Mitglied“ und durchlaufen Sie

5
    List nodes = rootElm.elements("member");
    for (Iterator it = nodes.iterator(); it.hasNext();) {
          Element elm = (Element) it.next();
          // do something
    }
für alle untergeordneten Knoten darunter einen Knoten durchlaufen

6
    for(Iterator it=root.elementIterator();it.hasNext();){
        Element element = (Element) it.next();
           // do something
      }
, Unterknoten unter einem Knoten hinzufügen

7
    Element ageElm = newMemberElm.addElement("age");
, Knotentext festlegen

8
    element.setText("29");
, einen Knoten löschen

9
    //childElm是待删除的节点,parentElm是其父节点
    parentElm.remove(childElm);
, einen

CDATA-Knoten hinzufügen

    Element contentElm = infoElm.addElement("content");
    contentElm.addCDATA(diary.getContent());


PS

: Beachten Sie, dass auf Knoten nicht über Schichten hinweg zugegriffen werden kann.


Knotenobjektattribut

1

, holen Sie sich ein Attribut unter einem bestimmten Knoten

2
    Element root=document.getRootElement();    
      //属性名name
    Attribute attribute=root.attribute("size");
, den Text des Attributs abrufen

3
     String text=attribute.getText();
, ein Attribut löschen

4
    Attribute attribute=root.attribute("size");
    root.remove(attribute);
, Alle Attribute eines Knotens durchlaufen

5
     Element root=document.getRootElement();    
    for(Iterator it=root.attributeIterator();it.hasNext();){
           Attribute attribute = (Attribute) it.next();
           String text=attribute.getText();
            System.out.println(text);
     }
, Attribute und Text eines Knotens festlegen

6
    newMemberElm.addAttribute("name", "sitinspring");
, festlegen Attribute Text

    Attribute attribute=root.attribute("name");
     attribute.setText("sitinspring");


Knoten an der angegebenen Position einfügen

1.

Knotenliste an der Einfügeposition abrufen (

list)2.

ruft

list.add(index,elemnent) auf, von Index bestimmt die Einfügeposition des Elements. Das Element Element

kann über das Objekt

DocumentHelper abgerufen werden. Beispielcode:

    Element aaa = DocumentHelper.createElement("aaa");
    aaa.setText("aaa");
    List list = root.element("书").elements();
    list.add(1, aaa);
    //更新document


Dokument in

XML

Datei

schreiben


1

, wenn das Dokument auf Englisch ist

XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
writer.write(document);
writer.close();

2、如果文档含有中文

OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");

XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/pc/XML8.xml"), outputFormat);
xmlWriter.write(document);
xmlWriter.close();

PS:出现乱码的原因是因为输出字符集不能识别中文,这样可以通过OutputFormatsetEncoding方法设置为UTF-8,然后再使用XMLWriter这种形参的(OutputStream out, OutputFormat format) 构造方构造方法,就能解决乱码问题了,至于为什么会用createPrettyPrint方法,是因为这样做输出的格式更符合人的阅读习惯。


综合案例

XML8.xml

<?xml version="1.0" encoding="utf-8"?>
<班级 班次="1班" 编号="C1">
	<学生 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
		<名字>张三</名字>
		<年龄>20</年龄>
		<介绍>不错</介绍>
	</学生>
	<学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1">
		<名字>李四</名字>
		<年龄>18</年龄>
		<介绍>很好</介绍>
	</学生>
	<学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1">
		<名字>王五</名字>
		<年龄>22</年龄>
		<介绍>非常好</介绍>
	</学生>
	<学生 性别="男" 班级编号="C1">
		<名字>小明</名字>
		<年龄>30</年龄>
		<介绍>好</介绍>
	</学生>
</班级>


package com.pc;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
 * 
 * @author Switch
 * @function 使用DOM4j解析XML文件
 * 
 */
public class XML8 {
	// 使用DOM4j对XML进行CRUD操作
	public static void main(String[] args) throws Exception {
		// 1.得到解析器
		SAXReader saxReader = new SAXReader();
		// 2.指定解析哪个XML文件
		Document document = saxReader.read(new File("src/com/pc/XML8.xml"));
		// list(document.getRootElement());
		// read(document);
		// readByXPath(document);
		// add(document);
		// delete(document);
		// updateElement(document);
		// updateAttribute(document);
		// addByIndex(document, 3);
	}

	// 更新属性(修改所有班级编号为C2)
	public static void updateAttribute(Document document) throws Exception {
		// 得到所有学生
		List<Element> students = document.getRootElement().elements("学生");
		for (Element e : students) {
			// 修改班级编号
			e.addAttribute("班级编号", "C2");
		}
		updateToXML(document);
	}

	// 更新元素(将所有学生的年龄+3)
	public static void updateElement(Document document) throws Exception {
		// 得到所有学生
		List<Element> students = document.getRootElement().elements("学生");
		for (Element e : students) {
			// 取出年龄
			Element age = e.element("年龄");
			age.setText(Integer.parseInt(age.getTextTrim()) + 3 + "");
		}
		updateToXML(document);
	}

	// 删除元素(删除第一个学生)
	public static void delete(Document document) throws Exception {
		// 找到元素
		Element stu = document.getRootElement().element("学生");
		// 删除
		stu.getParent().remove(stu);

		// 更新
		updateToXML(document);
	}

	// 添加元素到指定位置
	public static void addByIndex(Document document, int index)
			throws Exception {
		// 创建一个元素
		Element newStu = DocumentHelper.createElement("学生");
		newStu.setText("小花");
		// 得到所有学生的list
		List<Element> students = document.getRootElement().elements("学生");
		// 按索引添加
		students.add(index, newStu);

		// 更新
		updateToXML(document);
	}

	// 添加元素(添加一个学生到xml中)
	public static void add(Document document) throws Exception {
		// 创建一个学生节点对象

		Element newStu = DocumentHelper.createElement("学生");
		// 给元素添加属性
		newStu.addAttribute("学号", "n4");
		Element newStuName = DocumentHelper.createElement("名字");
		Element newStuAge = DocumentHelper.createElement("年龄");
		Element newStuIntro = DocumentHelper.createElement("介绍");

		// 把子元素挂载到学生节点下
		newStu.add(newStuName);
		newStu.add(newStuAge);
		newStu.add(newStuIntro);
		// 将学生挂载在根节点下
		document.getRootElement().add(newStu);

		// 更新
		updateToXML(document);
	}

	private static void updateToXML(Document document)
			throws UnsupportedEncodingException, FileNotFoundException,
			IOException {
		// 更新xml文件
		// 直接输出会出现中文乱码
		OutputFormat outputFormat = OutputFormat.createPrettyPrint();
		outputFormat.setEncoding("utf-8");

		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(
				"src/com/pc/XML8.xml"), outputFormat);
		xmlWriter.write(document);
		xmlWriter.close();
	}

	// xpath技术,跨层读取某个元素
	public static void readByXPath(Document document) throws Exception {
		// 取出第一个学生
		Element student = (Element) document.selectSingleNode("/班级/学生[1]");
		System.out.println("姓名:" + student.elementText("名字") + "\t年龄:"
				+ student.elementText("年龄") + "\t介绍:"
				+ student.elementText("介绍") + "\t性别:"
				+ student.attributeValue("性别"));
	}

	// 读取指定的某个元素(读取第一个学生的信息)
	public static void read(Document document) throws Exception {
		// 得到根元素
		Element root = document.getRootElement();
		// root.elements("学生"); 取出root元素下的所有学生元素
		// root.element("学生"); 取出root元素下的第一个学生元素
		// 取出root元素下的第一个学生元素
		Element student = (Element) root.elements("学生").get(0);
		System.out.println("姓名:" + student.elementText("名字") + "\t年龄:"
				+ student.elementText("年龄") + "\t介绍:"
				+ student.elementText("介绍") + "\t性别:"
				+ student.attributeValue("性别"));
	}

	// 遍历xml文件
	public static void list(Element element) {
		System.out.println("元素名称:" + element.getName() + "\t元素内容:"
				+ element.getTextTrim());

		Iterator<Element> iterator = element.elementIterator();

		while (iterator.hasNext()) {
			Element e = iterator.next();
			// 递归
			list(e);
		}
	}
}

 以上就是XML编程-DOM4J的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:XML-Programmierung-SAXNächster Artikel:XML-Programmierung-SAX