1. Préface
Dom4j est une très excellente API open source Java, principalement utilisée pour lire et écrire des documents XML, avec d'excellentes performances, des fonctions puissantes et une utilisation très pratique. De plus, XML est souvent utilisé pour les opérateurs d'échange de données, tels que l'appel des paramètres transmis par le service Web et effectuer des opérations de synchronisation de données, il est donc très nécessaire d'utiliser DOM4J pour analyser le XML.
2. Conditions de préparation
Dom4j.jar
Télécharger l'adresse: http://sourceforge.net/projects/dom4j/
3. Utilisez DOM4J pour pratiquer
1. Analyse du document XML
Idées de mise en œuvre:
<1> Après avoir lu le chemin XML, il est transmis au SaxReader et renvoie un objet de document de document;
<2> Ensuite, exploitez cet objet de document pour obtenir les informations des nœuds et enfants suivants;
Le code spécifique est le suivant:
Importer java.io.file; Importer JavaioFileInputStream; Importer JavaioInputStream; importer Javautiliterator; importer Javautillist; Importer OrGom4JDocument; Importer OrGom4JDocumentHelper; Importer OrGom4Jelement; Importer OrGom4JiosaxReader; / ** * Utiliser Dom4j pour analyser les documents XML * @Author Administrator * * / public class Dom4JParsexMlEMO {public void parsexml01 () {try {// converti le XML ci-dessous SRC en Stream InputStream InputStream = new FileInputStream (nouveau fichier ("d: project / dynamicweb / src / ressource / modulex"); // inputStream inputStream = thisGetClass () getResourceSStream ("/ modulexml"); // Vous pouvez également trouver XML basé sur le chemin relatif du fichier compilé de la classe // Créer un lecteur SAXREDER, spécifiquement utilisé pour lire XML SaxReader saxReader = new saxReader (); // Selon la méthode de réécriture de lecture de SaxReader, il peut être lu via le flux d'entrée InputStream ou via l'objet de fichier // document de document = saxReaderRead (InputStream); Document document = saxReaderRead (nouveau fichier ("d: / project / dynamicweb / src / ressource / modulexml")); // le chemin absolu du fichier doit être spécifié // en outre, le convertisseur XML fourni par documenthelper peut également être utilisé. // document document = documentHelperParsEText ("<? Xml version = /" 0 / "Encoding = /" utf-8 / "?> <Modules id = /" 123 / "> <module> Ceci est le texte des informations du module </odule> </odules>"); // Obtenez l'élément d'objet du nœud racine rootageElement = DocumentGetRootelement (); SystemOutPrintln ("Nom du nœud racine:" + rootElementGetName ()); // Obtenez le nom de nœud SystemOutPrintln ("combien d'attributs le nœud racine a-t-il:" + rootElementAtTrutCount ()); // Obtenez le nombre de nœuds nœud La valeur du nœud d'attribut id systemoutprintln ("Texte dans le nœud racine:" + rootingElementGetText ()); // Si l'élément a des enfants, il renvoie une chaîne vide, sinon le texte dans le nœud sera retourné // rootElementGetText () La raison pour laquelle la ligne se casse est parce que la clé de la ligne est utilisée entre l'étiquette et l'étiquette, qui est également considérée comme le texte, donc la ligne de la ligne est affichée. SystemOutPrintln ("Texte (1):" + RooteElementGetTextTrim ()); // Ce qui est supprimé, c'est la clé de onglet et la rupture de ligne entre la balise et la balise, etc., pas l'espace avant et après le contenu SystemOutPrintLn ("Contenu du texte du nœud nœud nœud nœud:" + rootElementGetStringValue ()); // Renvoie les informations texte de tous les nœuds enfants récursivement sur le nœud actuel. // Obtenez l'élément de nœuds enfants = rootElementElement ("module"); if (élément! = null) {SystemEPutPrintln ("Texte de sous-nœud:" + elementGetText ()); // Parce que le nœud enfant et le nœud racine sont des objets d'élément, leurs méthodes de fonctionnement sont les mêmes} // Cependant, dans certains cas, le XML est plus compliqué et les spécifications ne sont pas unifiées. Il n'y a pas de javalangnullpointerexception directe pour un certain nœud, donc après avoir obtenu l'objet élément, vous devez d'abord déterminer s'il est vide RootElementSetName ("root"); // prendre en charge pour modifier le nom de nœud SystemEPutPrintln ("le nom après le nœud racine est modifié:" + rootElementTEtName ()); rootElElementText ("texte"); // Il en va de même pour la modification du texte dans le balise SystemOutPrintln ("Texte après le modification du nœud racine:" + rootingElementGetText ()); } catch (exception e) {eprintStackTrace (); }} public static void main (String [] args) {dom4jparsexmldemo démo = new Dom4jparsexMldeMo (); DemoParsexml01 (); }}De plus, le XML ci-dessus est sous SRC, module01.xml est le suivant:
<? xml version = "0" coding = "utf-8"?> <modules id = "123"> <module> Il s'agit des informations de texte de la balise du module </odule> </dudules>
Ensuite, exécutez la méthode principale de cette classe, et l'effet de console est le suivant:
De cela, nous savons:
<1> Il existe de nombreuses façons de lire les fichiers XML;
<2> Il est très simple de retirer le nom du texte et de l'étiquette de l'objet élément;
<3> Et il est très pratique de modifier les noms de texte et d'étiquette des éléments, mais il ne sera pas écrit dans les fichiers XML disque.
Ce qui précède obtient simplement l'élément du répertoire racine du XML, puis des boucles via l'objet de document de document à l'aide de l'itérateur Iterator.
Le code spécifique est le suivant:
public void parsexml02 () {try {// convertir le xml ci-dessous SRC en flux d'entrée inputStream inputStream = thisGetClass () getResourCeasStream ("/ modulexml"); // Créer un lecteur SAXREDER spécifiquement pour lire XML SAXREDER SAXREDER = new saxReader (); // Selon la méthode de réécriture de lecture de SaxReader, il peut être vu qu'il peut être lu via le flux d'entrée InputStream, ou il peut être lu via le document d'objet de fichier = SAXReaderRead (InputStream); Element rootElement = documentGetRootelement (); Iterator <element> moduleSiterator = rootElementElements ("module") iterator (); // rootElementElement ("name"); Obtenez un certain élément enfant // rootElementElements ("nom"); Obtenez l'ensemble des nœuds Moudule Elements Child sous le nœud racine, renvoyez le type de collection de liste // rootElementElements ("module") iterator (); Itérer chaque élément de la collection de liste retournée et renvoyez tous les nœuds enfants dans une collection Iterator While (moduleSiteratorHasNext ()) {Element moduleElement = moduleSiterAratorNext (); Element NameElement = moduleElementElement ("name"); SystemOutPrintln (nameElementGetName () + ":" + nameElementGetText ()); Element ValueElement = moduleElementElement ("Value"); SystemOutPrintln (ValueElementGetName () + ":" + ValueElementGetText ()); Element DescriptionElement = moduleElementElement ("Descript"); SystemOutPrintln (DescriptElementGetName () + ":" + décritsElementGetText ()); }} catch (exception e) {eprintStackTrace (); }} De plus, le XML ci-dessus est sous SRC, module02.xml est le suivant:
<? xml version = "1.0" coding = "utf-8"?> <modules id = "123"> <nodule> <name> oa </name> <value> Configuration du système de base </value> </ descript> Directoire racine de configuration du système de base </script> </dodules> </ / modules>
Ensuite, exécutez la méthode principale de cette classe, et l'effet de console est le suivant:
De cela, nous savons:
<1> DOM4J itère sur les sous-éléments XML très efficaces et pratiques;
Cependant, ce qui précède itère simplement sur les éléments du nœud enfant de XML, mais si les règles XML sont plus compliquées, comme le module03.xml à tester ensuite, les détails sont les suivants:
<? xml version = "1.0" coding = "utf-8"?> <modules id = "123"> <module> Il s'agit des informations texte de la balise du module </odule> <module id = ""> <name> oa </name> <value> Configuration du système de base </value> <descript> Configuration de base pour le système </script> <modulule> </ module> <odule> <name> Configuration de gestion </nom> <value> Aucun </ value> <escript> Instructions pour la gestion de la configuration </ descript> <module id = "106"> <name> Gestion du système </nom> <value> 0 </ value> <escript> config </ descript> <module id = "107"> <name> Département </same> <value> <escript> Numéro </Spript> </odule> </odule> </odule> </odules>
Parce que leurs structures sont différentes, s'ils itéèrent directement, une erreur sera signalée:
java.lang.nullpointerException
Vous devez donc l'utiliser avec soin à ce moment. Vous ne pouvez pas mettre les éléments directement en itérant à chaque fois. Le code d'implémentation spécifique est le suivant:
public void parsexml03 () {try {// converti le xml ci-dessous src en flux d'entrée inputStream inputStream = thisGetClass () getResourCeasStream ("/ modulexml"); // Créer un lecteur SAXREDER spécifiquement pour lire XML SAXREDER SAXREDER = new saxReader (); // Selon la méthode de réécriture de lecture de SaxReader, il peut être vu qu'il peut être lu via le flux d'entrée InputStream, ou il peut être lu via le document d'objet de fichier = SAXReaderRead (InputStream); Element rootElement = documentGetRootelement (); if (rootageElementElements ("module")! = null) {// Parce que la première balise de module n'a que du contenu et pas de nœuds enfants, iterator () est javalangnullpointerException, il doit donc implémenter la liste <element> elementList = rootElementElementations ("module"); pour (élément élément: elementList) {if (! elementGetTextTrim () equals ("")) {SystemOutPrintln ("【1】" + elementGetTextTrim ()); } else {element nameElement = elementElement ("name"); SystemOutPrintln ("【2】" + nameElementGetName () + ":" + nameElementGetText ()); Element ValueElement = elementElement ("Value"); SystemOutPrintln ("【2】" + ValueElementGetName () + ":" + ValueElementGetText ()); Element DescriptionElement = elementElement ("Descript"); SystemOutPrintln ("【2】" + DescriptionElementGetName () + ":" + DescriptionElementGetText ()); List <element> sublelementList = elementElements ("module"); for (Element subilement: subelementList) {if (! sublelementGetTextTrim () equals ("")) {SystemOutPrintln ("【3】" + sublelementGetTextTextTrim ()); } else {element subNameElement = subelementElement ("name"); SystemOutPrintln ("【3】" + subNameElementGetName () + ":" + subNameElementGetText ()); Element subVALueElement = subilementElement ("Value"); SystemOutPrintln ("【3】" + SubValueElementGetName () + ":" + SubValueElementGetText ()); Element subDescriptElement = subilementElement ("Descript"); SystemOutPrintln ("【3】" + subDescriptElementGetName () + ":" + subDescriptElementGetText ()); }}}}}} catch (exception e) {eprintStackTrace (); }}Ensuite, exécutez la méthode principale de cette classe, et l'effet de console est le suivant:
Ok, maintenant nous pouvons résoudre le problème des références vides dans des documents itératifs.
De plus, le code peut en fait être refactorisé, car le fonctionnement de l'élèvement d'éléments enfants dans la boucle est répétitif, et il peut être amélioré par la récursivité, mais la lisibilité sera un peu pire.
Si vous avez parfois besoin d'obtenir toutes les informations de texte dans XML, ou que le format XML passé par d'autres n'est pas standardisé, comme le nom de la balise est sensible à la cas, bien que XML ne soit pas sensible à la casse, il doit apparaître par paires. Donc, pour éviter cela, vous pouvez simplement modifier tous les noms de balises pour capitaliser. Le code spécifique est le suivant:
public static void main (String [] args) {String str = "<? xml version = /" 0 / "Encoding = /" utf-8 / "?> <modules id = /" 123 / "> <valudule> Il s'agit de la configuration du texte du module <nom> OA </ name> <value> Configuration de base </value> <descript> Configuration de base de la configuration de la configuration de la configuration de la configuration de l'OA </ Name> System </Spript> </nodule> </nodules> "; SystemUtprintln (strReplaceALL ("<[^ <] *>", "_")); Motif motif = patternCompile ("<[^ <] *>"); Matcher Matcher = PatternMatcher (STR); while (MatcherFind ()) {str = strReplaceAll (MatcherGroup (0), MatcherGroup (0) Toupperase ()); } SystemOutPrintln (STR); }Après la course, les rendus sont les suivants:
2. Générer un document XML
DOM4J peut analyser XML, et il générera certainement du XML, et il est plus facile à utiliser.
Idées de mise en œuvre:
<1> DocumentHelper fournit une méthode pour créer un objet de document;
<2> Fonctionnez cet objet de document et ajoutez le nœud et le texte, le nom et les valeurs d'attribut sous le nœud;
<3> Utilisez ensuite l'écrivain XMLWriter pour écrire l'objet de document encapsulé sur disque;
Le code spécifique est le suivant:
import java.io.filewriter; Importer JavaioIoIoException; importer javaiowriter; Importer OrGom4JDocument; Importer OrGom4JDocumentHelper; Importer OrGom4Jelement; Importer OrGDom4JiOxmlWriter; / ** * Utilisez DOM4J pour générer des documents XML * @Author Administrator * * / public class Dom4jBuildxMlDemo {public void build01 () {try {// DocumentHelper fournit une méthode pour créer un document d'objet document document = documentHelPerreateDocument (); // Ajouter un élément d'information de nœud rootEllement = documentAdDelement ("modules"); // Cela peut continuer à ajouter des nœuds enfants, ou spécifier le contenu rootElementText ("Ceci est les informations texte de la balise du module"); Élément élément = rootElementAdDelement ("module"); Element NameElement = elementAdDelement ("name"); Element ValueElement = elementAdDelement ("Value"); Element DescriptionElement = elementAdDelement ("Description"); nameElelementText ("name"); nameElementAddAttribute ("Language", "Java"); // Ajouter une valeur d'attribut pour Node ValueELeLETTETT ("Value"); ValueElementAddAttribute ("Language", "C #"); DescriptionELelementEtText ("Description"); DescriptionElementAddAttribute ("Language", "SQL Server"); SystemOutPrintln (documentsxml ()); // convertir l'objet document directement en scénario de sortie de chaîne FileWriter = new FileWriter ("c: // modulexml"); // Dom4j fournit un objet spécifiquement écrit dans les fichiers xmlwriter xmlwriter xmlwriter = new xmlwriter (filewriter); xmlwriterwrite (document); xmlWriterFlush (); xmlwriterClose (); SystemOutPrintln ("Le document XML a été ajouté avec succès!"); } catch (ioException e) {eprintStackTrace (); }} public static void main (String [] args) {dom4jbuildxmldemo démo = new Dom4jbuildxMldeMo (); Demobuild01 (); }} L'effet de l'exécution du code est le suivant:
Ensuite, allez au lecteur C ci-dessous pour vérifier si la création a réussi. Il s'est avéré que le contenu du fichier XML est le même que la sortie du contenu par la console.
De plus, le XML généré ci-dessus ne spécifie pas le format de codage, mais UTF-8 est toujours affiché, indiquant qu'il s'agit du format de codage par défaut. Si vous souhaitez ré-spécifier, vous pouvez ajouter Document.SetXMLencoding ("GBK"); avant d'écrire sur disque.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.