Partage
  • Partager sur Facebook
  • Partager sur Twitter

Coder un parser DOM en Java

Anonyme
25 avril 2012 à 15:08:26

Bonjour,

J'essaye de coder un parser DOM en langage Java, afin de lire un fichier XML.
Pour cela, j'utilise les tutoriel suivants :


Mon problème est le suivant : le code que j'ai créé parcours bien l'arbre comme il faut, mais il me rajoute plein de #texte : et je ne comprends pas vraiment à quoi ça correspond. Si vous pouviez m'éclairer.

Voici mon fichier .xml :
<?xml version="1.0" encoding="UTF-8" ?>
<company>
	<staff>
		<firstname>yong</firstname>
		<lastname>mook kim</lastname>
		<nickname>mkyong</nickname>
		<salary>100000</salary>
	</staff>
	<staff>
		<firstname>low</firstname>
		<lastname>yin fong</lastname>
		<nickname>fong fong</nickname>
		<salary>200000</salary>
	</staff>
</company>


Voici mon code java :
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
 
public class ReadXMLFile_4 {
 
	public static void main(String argv[]) {
 
	  try {
 
		File fXmlFile = new File("C:\\file.xml");
		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
		Document doc = dBuilder.parse(fXmlFile);
		doc.getDocumentElement().normalize();
 
		Node root = doc.getDocumentElement();
		System.out.println("Root element :" + root.getNodeName());
		NodeList nListRoot = root.getChildNodes();
		
		for (int i = 0; i < nListRoot.getLength(); i++)
		{
			parsageEnfant(nListRoot.item(i));
		}
		

	  } catch (Exception e) {
		e.printStackTrace();
	  }
  }
 
	public static void parsageEnfant(Node node) {
		
		System.out.print(node.getNodeName()+" :\n");
		
		
		if (node.hasChildNodes())
		{
			NodeList nList = node.getChildNodes();
			
			for (int i = 0; i < nList.getLength(); i++)
			{
				parsageEnfant(nList.item(i));
			}
		}
		else
		{
			parsageNormal(node);
		}
	}
	
	public static void parsageNormal(Node node) {
	
		System.out.print(node.getNodeName() + " : " + node.getNodeValue());
	}
}


Voici le résultat de mon code :

Root element :company
#text :
#text :
staff :
#text :
#text :
firstname :
#text :
#text : yong#text :
#text :
lastname :
#text :
#text : mook kim#text :
#text :
nickname :
#text :
#text : mkyong#text :
#text :
salary :
#text :
#text : 100000#text :
#text :
#text :
#text :
staff :
#text :
#text :
firstname :
#text :
#text : low#text :
#text :
lastname :
#text :
#text : yin fong#text :
#text :
nickname :
#text :
#text : fong fong#text :
#text :
salary :
#text :
#text : 200000#text :
#text :
#text :
#text :


Si jamais quelqu'un sait expliquer d'où viennent tous ces #text :, et comment éviter qu'ils s'affichent, ça me ferait très plaisir :)

Merci.

PS : Je suis nouveau sur le forum et je n'ai pas trouvé de rubrique Présentation des membres"
  • Partager sur Facebook
  • Partager sur Twitter
25 avril 2012 à 15:10:47

Tous les "#text :" représentent les noeuds textes du document XML, tu trouveras toutes les infos sur ce concept via ton moteur de recherche préféré.

Quant au topic de présentation, il n'existe pas, parce que "292 682 Zéros inscrits".
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
25 avril 2012 à 23:46:27

Salut,
C'est quand même dommage pour le topic de présentation... :p

Après quelques recherches sur la piste des "noeuds textes", j'ai trouvé une sorte d'explication sur le sdZ même (ici) ! Il semble que les noeuds textes dont tu parles sont des sortes de balises <#text></#text> invisibles présentes de base. et j'ai réussi à les ignorer de cette manière (pas sûr que ce soit optimal, par contre) :

public static void parcourirArbre(Node node) {
		
		
		if (node.getNodeName() == "#text")
		{
			if (node.getNodeValue() != null)
			{
				System.out.print(node.getNodeValue());
			}
		}
		else
		{
			System.out.print(node.getNodeName()+" : ");
		}
		
		if (node.hasChildNodes())
		{
			NodeList nList = node.getChildNodes();
			
			for (int i = 0; i < nList.getLength(); i++)
			{
				parcourirArbre(nList.item(i));
			}
		}

	}


J'ai quand même un peu de mal à comprendre le concept de rajouter des noeuds invisibles.
Il ne me reste plus qu'à m'attaquer aux attributs et la modification du fichier...
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2012 à 1:09:39

Citation : ShaMaster


if (node.getNodeName() == "#text")

Le résultat de la comparaison n'est pas garantit, on ne compare que très rarement des object avec == en Java. C'est utile sur les entiers, caractères, booléens ou énumérations, mais pour tout le reste on utilise equals()...

C'est la base du Java ça, je te conseille de (re)lire un cours.
  • Partager sur Facebook
  • Partager sur Twitter
Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
13 mai 2014 à 8:50:35

Bonjour,

J'ai repris votre code; mais pour enlever les "#Texte" il faut prendre node.getTexteContent(), à la place de node.getNodeValue().

Cordialement

  • Partager sur Facebook
  • Partager sur Twitter
19 mai 2022 à 1:41:33 - Message modéré pour le motif suivant : Message complètement hors sujet


19 mai 2022 à 3:38:45

@AbeerBk Bonsoir, merci de ne pas déterrer d'ancien sujet. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses) un descriptif de votre problème et le code que vous avez écrit inséré sur le forum avec l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter