Maison > développement back-end > Tutoriel XML/RSS > XML : DOM4J pour l'analyse XML

XML : DOM4J pour l'analyse XML

黄舟
Libérer: 2017-02-24 15:14:51
original
1520 Les gens l'ont consulté


Pourquoi y a-t-il Dom4j en premier lieu ?

Parce que DOM consomme trop de mémoire et que SAX ne peut lire que XML, mais ne peut pas ajouter, supprimer, etc. C'est ainsi qu'est apparu Dom4j, qui est plus efficace et peut également effectuer des opérations grossières.

1. Introduction à DOM4J

  • Dom4j est une bibliothèque open source simple et flexible. Dom4j a été séparé des premiers développeurs de JDOM puis développé indépendamment. Contrairement à JDOM, dom4j utilise des interfaces et des classes de base abstraites. Bien que l'API de Dom4j soit relativement complexe, elle offre une meilleure flexibilité que JDOM.

  • Dom4j est une très excellente API Java XML avec d'excellentes performances, des fonctions puissantes et extrêmement simple à utiliser. De nombreux logiciels utilisent désormais Dom4j, comme Hibernate, y compris le JAXP de Sun, qui utilise également Dom4j.

  • Pour développer avec Dom4j, vous devez télécharger le fichier jar correspondant de dom4j et l'importer dans le projet. Adresse de téléchargement dom4j download

Cas 2.DOM4J

Toujours en utilisant notre précédent fichier XML :

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
Copier après la connexion
Copier après la connexion

La Documentation est placé dans le package com.dom4j.test.

Utiliser DOM4J nécessite également d'obtenir l'objet Document représentant l'intégralité du document, mais cet objet Document est dans le package org.dom4j.

Obtenez l'objet Document dans la méthode principale comme suit :

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
Copier après la connexion
Copier après la connexion

Ensuite, nous pouvons écrire la méthode correspondante en fonction des besoins et l'appeler dans la méthode principale.

【1】Spécifier pour lire un élément (lire les informations du premier élève)

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);
}
Copier après la connexion
Copier après la connexion

【2】Ajouter un élément : Ajouter un informations sur l'élève dans le document 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();
}
Copier après la connexion
Copier après la connexion

Pour ajouter un élève au document XML, vous devez également écrire l'objet Document en mémoire dans le fichier correspondant à la fin, sinon toutes les opérations sont juste Il est effectué en mémoire et ne sera pas sorti dans un fichier similaire au DOM.
Nous pouvons toujours écrire ce code mis à jour comme une méthode distincte, comme suit :

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();
}
Copier après la connexion
Copier après la connexion

[3] Ajouter un élément à la position spécifiée

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);
}
Copier après la connexion
Copier après la connexion

Ici, vous pouvez l'ajouter directement au List obtenu puis le mettre à jour. Le List voici le java.utilList


dans le package [4] Supprimer un élément ou supprimer les attributs de cet élément
Supprimer un élément et DOM De même, le nœud est supprimé via le nœud parent correspondant. Par exemple, nous voulons supprimer le premier nœud étudiant :

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}
Copier après la connexion
Copier après la connexion

[5] Mettre à jour l'élément
Par exemple, nous voulons ajouter 1 à l'âge de tous les étudiants, et Changer l'attribut d'adresse de tous les étudiants aux États-Unis :

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);
}
Copier après la connexion
Copier après la connexion

Pourquoi y a-t-il Dom4j en premier lieu ?

Parce que DOM consomme trop de mémoire et que SAX ne peut lire que XML, mais ne peut pas ajouter, supprimer, etc. C'est ainsi qu'est apparu Dom4j, qui est plus efficace et peut également effectuer des opérations grossières.

1. Introduction à DOM4J

  • Dom4j est une bibliothèque open source simple et flexible. Dom4j a été séparé des premiers développeurs de JDOM puis développé indépendamment. Contrairement à JDOM, dom4j utilise des interfaces et des classes de base abstraites. Bien que l'API de Dom4j soit relativement complexe, elle offre une meilleure flexibilité que JDOM.

  • Dom4j est une très excellente API Java XML avec d'excellentes performances, des fonctions puissantes et extrêmement simple à utiliser. De nombreux logiciels utilisent désormais Dom4j, comme Hibernate, y compris le JAXP de Sun, qui utilise également Dom4j.

  • Pour développer avec Dom4j, vous devez télécharger le fichier jar correspondant de dom4j et l'importer dans le projet. Adresse de téléchargement dom4j download

Cas 2.DOM4J

Toujours en utilisant notre précédent fichier XML :

<?xml version="1.0" encoding="utf-8" standalone="no"?><班级>
    <学生 地址="香港">
        <名字>周小星</名字>
        <年龄>23</年龄>
        <介绍>学习刻苦</介绍>
    </学生>
    <学生 地址="澳门">
        <名字>林晓</名字>
        <年龄>25</年龄>
        <介绍>是一个好学生</介绍>
    </学生></班级>
Copier après la connexion
Copier après la connexion

La Documentation est placé dans le package com.dom4j.test.

Utiliser DOM4J nécessite également d'obtenir l'objet Document représentant l'intégralité du document, mais cet objet Document est dans le package org.dom4j.

Obtenez l'objet Document dans la méthode principale comme suit :

// 1.得到一个解析器SAXReader saxReader = new SAXReader();
// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/dom4j/test/myClass.xml"));
Copier après la connexion
Copier après la connexion

Ensuite, nous pouvons écrire la méthode correspondante en fonction des besoins et l'appeler dans la méthode principale.

【1】Spécifier pour lire un élément (lire les informations du premier élève)

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);
}
Copier après la connexion
Copier après la connexion

【2】Ajouter un élément : Ajouter un informations sur l'élève dans le document 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();
}
Copier après la connexion
Copier après la connexion

Pour ajouter un élève au document XML, vous devez également écrire l'objet Document en mémoire dans le fichier correspondant à la fin, sinon toutes les opérations sont juste Il est effectué en mémoire et ne sera pas sorti dans un fichier similaire au DOM.
Nous pouvons toujours écrire ce code mis à jour comme une méthode distincte, comme suit :

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();
}
Copier après la connexion
Copier après la connexion

[3] Ajouter un élément à la position spécifiée

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);
}
Copier après la connexion
Copier après la connexion

Ici, vous pouvez l'ajouter directement au List obtenu puis le mettre à jour. Le List voici le java.utilList


dans le package [4] Supprimer un élément ou supprimer les attributs de cet élément
Supprimer un élément et DOM De même, le nœud est supprimé via le nœud parent correspondant. Par exemple, nous voulons supprimer le premier nœud étudiant :

public static void delete(Document document) throws Exception {    // 找到该元素
    Element student = document.getRootElement().element("学生");    // 删除元素的某个属性
    student.remove(student.attribute("地址"));    // 通过父节点删除节点
    student.getParent().remove(student);
    update(document);
}
Copier après la connexion
Copier après la connexion

[5] Mettre à jour l'élément
Par exemple, nous voulons ajouter 1 à l'âge de tous les étudiants et modifiez l'attribut d'adresse de tous les étudiants en États-Unis :

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);
}
Copier après la connexion
Copier après la connexion

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


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal