XML - XML 解析用の DOM4J

黄舟
リリース: 2017-02-24 15:14:51
オリジナル
1527 人が閲覧しました


まず第一に、なぜ Dom4j があるのでしょうか?

DOM はメモリを大量に消費し、SAX は XML を読み取ることしかできず、追加や削除などができないためです。そこで、より効率的で、下品な操作も実行できる Dom4j が登場しました。

1. DOM4J の概要

  • Dom4j は、シンプルで柔軟なオープンソース ライブラリです。 Dom4j は JDOM の初期開発者から分離され、その後独立して開発されました。 JDOM とは異なり、dom4j はインターフェイスと抽象基本クラスを使用します。Dom4j の API は比較的複雑ですが、JDOM よりも優れた柔軟性を備えています。

  • Dom4j は、優れたパフォーマンス、強力な機能を備え、非常に使いやすい、非常に優れた Java XML API です。現在、同じく Dom4j を使用する Sun 独自の JAXP を含む、Hibernate などの多くのソフトウェアが Dom4j を使用しています。

  • Dom4j を使用して開発するには、対応する dom4j の jar ファイルをダウンロードし、プロジェクトにインポートする必要があります。ダウンロード アドレス dom4j download

2.DOM4J case

以前の XML ファイルを引き続き使用します:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
ログイン後にコピー
ログイン後にコピー

このドキュメントは com.dom4j.test パッケージに配置されています。 com.dom4j.test包中。

使用DOM4J也要获取代表整个文档Document对象,不过这个Document对象是org.dom4j包中的。

在主方法中获取Document对象如下:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
ログイン後にコピー
ログイン後にコピー

然后我们就可以根据需求来写相应的方法,在主方法中调用。

【1】指定读取某个元素(读取第一个学生的信息)

public static void read(Document document) {    // 得到根元素
    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素
    // root.element("学生"):表示取出root下的第一个学生元素
    Element student = root.element("学生");    // 取出属性
    String address = student.attributeValue("地址");    // 取出各个子节点的值
    String name = student.element("名字").getText();
    String age = student.element("年龄").getText();
    String intro = student.element("介绍").getText();

    System.out.println(address);
    System.out.println(name);
    System.out.println(age);
    System.out.println(intro);
}
ログイン後にコピー
ログイン後にコピー

【2】添加元素:添加一个学生信息到XML文档中

public static void add(Document document) throws Exception {    // 首先我们来创建一个学生节点对象
    Element student = DocumentHelper.createElement("学生");
    Element name = DocumentHelper.createElement("名字");
    name.setText("小强");
    Element age = DocumentHelper.createElement("年龄");
    age.setText("22");
    Element intro = DocumentHelper.createElement("介绍");
    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下
    student.add(name);
    student.add(age);
    student.add(intro);    // 为学生添加属性
    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下
    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}
ログイン後にコピー
ログイン後にコピー

添加学生到XML文档中,也需要在最后将内存中的Document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:

public static void update(Document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}
ログイン後にコピー
ログイン後にコピー

【3】添加一个元素到指定位置

public static void addByIndex(Document document) throws Exception {    // 创建一个元素
    Element newStu = DocumentHelper.createElement("学生");
    newStu.setText("王小明");    // 得到所有学生的list
    List allStudent = document.getRootElement().elements("学生");
    allStudent.add(1, newStu);
    update(document);
}
ログイン後にコピー
ログイン後にコピー

这里其实是直接在得到的List中添加,然后更新即可。这里的List就是java.util包中的List


【4】删除一个元素或者删除这个元素的属性
删除一个元素与DOM类似,都是通过相应的父节点删除该节点。比方说我们要删除第一个学生节点:

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}
ログイン後にコピー
ログイン後にコピー

【5】更新元素
比如我们要把所有学生的年龄加1,并且将所有学生的地址属性改为美国:

public static void updateAgeAndAddress(Document document) throws Exception {
Element root = document.getRootElement();
    List<Element> list = root.elements();    for (Element element : list) {        // 更新属性
        element.addAttribute("地址", "美国");        // 更新年龄子节点的值
        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());
        e_age.setText(String.valueOf(age + 1));
    }
    update(document);
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

首先为什么会有Dom4j呢?

因为DOM太耗内存,而SAX只能对XML进行读取,而不能去添加、删除等。所以出现了Dom4j,它的效率更高,同时也可以进行crud操作。

1.DOM4J介绍

  • Dom4j是一个简单、灵活地开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。

  • Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括Sun公司自己的JAXP也用了Dom4j。

  • 使用Dom4j开发,需下载dom4j相应的jar文件,并导入到项目。下载地址dom4j下载

2.DOM4J案例

依然使用我们之前的XML文件:

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
ログイン後にコピー
ログイン後にコピー

该文档放在com.dom4j.test包中。

使用DOM4J也要获取代表整个文档Document对象,不过这个Document对象是org.dom4j包中的。

在主方法中获取Document对象如下:

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
ログイン後にコピー
ログイン後にコピー

然后我们就可以根据需求来写相应的方法,在主方法中调用。

【1】指定读取某个元素(读取第一个学生的信息)

public static void read(Document document) {    // 得到根元素
    Element root = document.getRootElement();    // root.elements("学生"):表示取出root下的所有学生元素
    // root.element("学生"):表示取出root下的第一个学生元素
    Element student = root.element("学生");    // 取出属性
    String address = student.attributeValue("地址");    // 取出各个子节点的值
    String name = student.element("名字").getText();
    String age = student.element("年龄").getText();
    String intro = student.element("介绍").getText();

    System.out.println(address);
    System.out.println(name);
    System.out.println(age);
    System.out.println(intro);
}
ログイン後にコピー
ログイン後にコピー

【2】添加元素:添加一个学生信息到XML文档中

public static void add(Document document) throws Exception {    // 首先我们来创建一个学生节点对象
    Element student = DocumentHelper.createElement("学生");
    Element name = DocumentHelper.createElement("名字");
    name.setText("小强");
    Element age = DocumentHelper.createElement("年龄");
    age.setText("22");
    Element intro = DocumentHelper.createElement("介绍");
    intro.setText("是一个三好学生");    // 把三个子元素加到student节点下
    student.add(name);
    student.add(age);
    student.add(intro);    // 为学生添加属性
    student.addAttribute("地址", "大理");    // 将学生节点添加到根节点下
    document.getRootElement().add(student);    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");    // 这里一定要用FileOutputStream字节流输出,不能用FileWriter,否则还会有乱码
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}
ログイン後にコピー
ログイン後にコピー

添加学生到XML文档中,也需要在最后将内存中的Document对象写入相应的文件,不然所有的操作只是在内存中进行,并不会输出到文件中,这与DOM类似。
我们依然可以将这段更新的代码单独写成一个方法,如下:

public static void update(Document document) throws Exception {    // 更新xml文件,直接输出会出现中文乱码,要用OutputFormat
    OutputFormat output = OutputFormat.createPrettyPrint();    // 设置输出的编码为utf-8
    output.setEncoding("utf-8");
    XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/dom4j/test/myClass.xml"), output);
    xmlWriter.write(document);
    xmlWriter.close();
}
ログイン後にコピー
ログイン後にコピー

【3】添加一个元素到指定位置

public static void addByIndex(Document document) throws Exception {    // 创建一个元素
    Element newStu = DocumentHelper.createElement("学生");
    newStu.setText("王小明");    // 得到所有学生的list
    List allStudent = document.getRootElement().elements("学生");
    allStudent.add(1, newStu);
    update(document);
}
ログイン後にコピー
ログイン後にコピー

这里其实是直接在得到的List中添加,然后更新即可。这里的List就是java.util包中的List

DOM4J を使用する場合、ドキュメント全体を表す Document オブジェクトも取得する必要がありますが、この Document オブジェクトは org.dom4j パッケージ内にあります。

次のように main メソッドで Document オブジェクトを取得します:

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}
ログイン後にコピー
ログイン後にコピー
次に、必要に応じて対応するメソッドを記述し、main メソッドで呼び出すことができます。


【1】特定の要素の読み込みを指定(最初の生徒の情報を読み込む)

public static void updateAgeAndAddress(Document document) throws Exception {
Element root = document.getRootElement();
    List<Element> list = root.elements();    for (Element element : list) {        // 更新属性
        element.addAttribute("地址", "美国");        // 更新年龄子节点的值
        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());
        e_age.setText(String.valueOf(age + 1));
    }
    update(document);
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

【2】要素の追加:XML文書に生徒の情報を追加🎜🎜rrreee🎜XML文書に生徒を追加そうでない場合、すべての操作はメモリ内でのみ実行され、ファイルには出力されません。これは DOM と似ています。 🎜この更新されたコードは、次のように別のメソッドとして記述することもできます: 🎜rrreee🎜🎜🎜【3】指定された位置に要素を追加します🎜🎜rrreee🎜実際に取得した List を直接追加します。それを入れて更新します。ここでのListjava.utilパッケージ内のListです🎜🎜🎜🎜【4】要素の削除、またはこの要素の属性の削除🎜 🎜 要素の削除は、対応する親ノードを通じてノードが削除されるという点で DOM に似ています。たとえば、最初の学生ノードを削除します: 🎜rrreee🎜🎜🎜[5] 要素を更新します 🎜 🎜たとえば、すべての学生の年齢に 1 を追加し、すべての学生の住所属性を米国に変更したいとします。州: 🎜rrreee🎜なぜ最初に Dom4j があるのでしょうか? 🎜🎜🎜DOM はメモリを大量に消費し、SAX は XML を読み取ることしかできず、追加や削除などができないためです。そこで、より効率的で、下品な操作も実行できる Dom4j が登場しました。 🎜🎜🎜🎜1. DOM4J の概要🎜🎜🎜🎜🎜Dom4j は、シンプルで柔軟なオープンソース ライブラリです。 Dom4j は JDOM の初期開発者から分離され、その後独立して開発されました。 JDOM とは異なり、dom4j はインターフェイスと抽象基本クラスを使用しますが、Dom4j の API は JDOM よりも優れた柔軟性を備えています。 🎜🎜🎜🎜Dom4j は、優れたパフォーマンス、強力な機能を備え、非常に使いやすい、非常に優れた Java XML API です。現在、同じく Dom4j を使用する Sun 独自の JAXP を含む、Hibernate などの多くのソフトウェアが Dom4j を使用しています。 🎜🎜🎜🎜 Dom4j を使用して開発するには、対応する dom4j の jar ファイルをダウンロードし、プロジェクトにインポートする必要があります。ダウンロード アドレス dom4j download🎜🎜🎜🎜🎜2.DOM4J case🎜🎜🎜 以前の XML ファイルを引き続き使用します:🎜rrreee🎜 このドキュメントは com.dom4j.test パッケージに配置されています。 🎜🎜DOM4J を使用する場合、ドキュメント全体を表す Document オブジェクトも取得する必要がありますが、この Document オブジェクトは org.dom4j パッケージ内にあります。 🎜🎜次のように main メソッドで Document オブジェクトを取得します: 🎜rrreee🎜 次に、必要に応じて対応するメソッドを記述し、main メソッドで呼び出すことができます。 🎜🎜🎜【1】特定の要素の読み込みを指定(最初の生徒の情報を読み込む)🎜🎜rrreee🎜🎜🎜【2】要素の追加:XML文書に生徒の情報を追加🎜🎜rrreee🎜XML文書に生徒を追加そうでない場合、すべての操作はメモリ内でのみ実行され、ファイルには出力されません。これは DOM と似ています。 🎜この更新されたコードは、次のように別のメソッドとして記述することもできます: 🎜rrreee🎜🎜🎜【3】指定された位置に要素を追加します🎜🎜rrreee🎜実際に取得した List を直接追加します。それを入れて更新します。ここでのListjava.utilパッケージ内のListです🎜🎜🎜🎜【4】要素の削除、またはこの要素の属性の削除🎜 🎜 要素の削除は、対応する親ノードを通じてノードが削除されるという点で DOM に似ています。例えば、最初の学生ノードを削除したいです: 🎜rrreee🎜🎜🎜【5】要素を更新🎜 🎜例えば、全学生の年齢に1を加え、全学生の住所属性を米国に変更したいとします。州: 🎜
public static void updateAgeAndAddress(Document document) throws Exception {
Element root = document.getRootElement();
    List<Element> list = root.elements();    for (Element element : list) {        // 更新属性
        element.addAttribute("地址", "美国");        // 更新年龄子节点的值
        Element e_age = element.element("年龄");        int age = Integer.parseInt(e_age.getTextTrim());
        e_age.setText(String.valueOf(age + 1));
    }
    update(document);
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

 以上就是XML—XML解析之DOM4J的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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