XML プログラミング - DOM4J

黄舟
リリース: 2017-02-20 15:13:52
オリジナル
1333 人が閲覧しました

XML API は、

jdom

に似ており、 XML

ファイルの読み取りと書き込みに使用されます。

dom4j


は、優れたパフォーマンス、強力な機能、そして非常に使いやすいという特徴を備えた非常に優れた

JavaXML APIであり、オープンソースソフトウェアでもあり、SourceForgeで見つけることができます。また、主流のJava XML APIのパフォーマンス、機能性、使いやすさを評価するIBM developerWorksの記事もあり、dom4jがあらゆる面で優れていることがわかります。非常に優れています。最近では、Java ソフトウェアが XML の読み書きに dom4j を使用していることがわかります。特に、SunJAXM さえも使用していることは注目に値します。 dom4jも使用します。これはすでに必須の jar パッケージであり、Hibernate も設定ファイルの読み書きに使用します。 : DOM4J が非常に強力である理由の 1 つは、 XPath テクノロジーをサポートしていることです。必要に応じて、対応するリファレンス ドキュメントを検索できます。そして自分でダウンロードしてください。 なぜDOM4Jがあるのですか? 以前、ブログで説明した2つの技術、

DOM

SAX技術について、前者の欠点はメモリを消費すること、後者の欠点は読み取り操作しか実行できないことです。および DOM4J 効率を送信し、粗雑な操作を実行できます。

追記:

DOM4J

を使用するには、対応する基本JAR

パッケージをインポートする必要があります。

DOM4Jの拡張機能を使用する場合は、拡張機能もインポートする必要があります。 JAR パッケージ。

DOM4Jはじめに

DOM4Jドキュメントオブジェクト

を取得する3つの方法1.XMLファイルを読むGet ドキュメントオブジェクト( よく使われます)

    SAXReader reader = new SAXReader();
    Document   document = reader.read(new File(“src/input.xml"));
ログイン後にコピー

2.XMLフォームテキストを解析し、documentオブジェクト
    String text = "<members></members>";
    Document document = DocumentHelper.parseText(text);
ログイン後にコピー
を取得します3.アクティブに

documentを作成しますオブジェクト
    Document document = DocumentHelper.createDocument();
    //创建根节点
    Element root = document.addElement("members");
ログイン後にコピー
PS

: Be対応する

JAR パッケージをインポートするように注意してください。


Nodeオブジェクト

1

、ドキュメントのルートノードを取得します

    Element root = document.getRootElement();
ログイン後にコピー


2
、ノードの子ノードを取得します


    Element element=node.element(“书名");
ログイン後にコピー

3
、ノードのコンテンツを取得します

    String text1=node.getText();
    String text2=node.getTextTrim();	// 去掉内容前面和后面的空格
ログイン後にコピー
4、特定のノードの下にある「

member」という名前のすべての子ノードを取得し、
    List nodes = rootElm.elements("member");
    for (Iterator it = nodes.iterator(); it.hasNext();) {
          Element elm = (Element) it.next();
          // do something
    }
ログイン後にコピー
5を走査して、すべての子ノードを取得します特定のノードの下の子ノード 子ノードを走査

    for(Iterator it=root.elementIterator();it.hasNext();){
        Element element = (Element) it.next();
           // do something
      }
ログイン後にコピー
6、特定のノードの下に子ノードを追加

    Element ageElm = newMemberElm.addElement("age");
ログイン後にコピー
7、ノードテキストを設定

    element.setText("29");
ログイン後にコピー
8、ノードを削除

    //childElm是待删除的节点,parentElm是其父节点
    parentElm.remove(childElm);
ログイン後にコピー
9

CDATA Node を追加します
    Element contentElm = infoElm.addElement("content");
    contentElm.addCDATA(diary.getContent());
ログイン後にコピー


PS

: レイヤーを越えてノードにアクセスできないことに注意してください。

nodeオブジェクト属性

1

、特定のnode

    Element root=document.getRootElement();    
      //属性名name
    Attribute attribute=root.attribute("size");
ログイン後にコピー
2の下で属性を取得し、属性のテキストを取得し、属性を削除します

     String text=attribute.getText();
ログイン後にコピー
4

、ノードのすべての属性をトラバースします
    Attribute attribute=root.attribute("size");
    root.remove(attribute);
ログイン後にコピー

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);
     }
ログイン後にコピー

6

、属性のテキストを設定します
    newMemberElm.addAttribute("name", "sitinspring");
ログイン後にコピー

指定された位置にノードを挿入します

1.挿入位置ノードリスト(

list


)

2.

list.add(index,elemnent)を呼び出し、element

の挿入位置を決定します。 インデックスElement 要素は、DocumentHelper オブジェクトを通じて取得できます。サンプルコード:

    Attribute attribute=root.attribute("name");
     attribute.setText("sitinspring");
ログイン後にコピー

ドキュメントをXMLファイルに書き込みます


1、ドキュメントが完全な英語の場合


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)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート