IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Parser un fichier xml (sans espaces et retours à la ligne) [DOM]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 28
    Points
    28
    Par défaut Parser un fichier xml (sans espaces et retours à la ligne)
    Bonjour,
    J'ai parsé un flux xml avec l'api dom et ça marche bien.
    Mais quand je veux parser le même flux en éliminant les espaces et les retours à la ligne j'arrive pas à le parser correctement:
    Voici un exemple de fichier xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <a>
    	<b>
    		<c>xxxxxx</c>
    		<d>
    			<e>yyyyy</e>
    		</d>
    	</b>
    </a>
    Voici le nouveau fichier xml après avoir éliminé les espaces et les retours à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a><b><c>xxxxxx</c><d><e>yyyyy</e></d></b></a>
    y'a t-il une méthode dans DOM pour gérer cela ?
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Pour gérer quoi ?

    Il est où le problème ?
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 28
    Points
    28
    Par défaut
    Si je parse le 1er fichier j'ai comme résultat:
    Console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    racine: a
    noeud: b
    feuille: c contenu: xxxxxx
    noeud: d 
    feuille: e contenu: yyyyy
    Alors si je parse le 2ème fichier (le même en éliminant les espaces et les retours à la ligne) j'ai des erreus de parsing. Voici le résultat obtenu:
    Console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    racine: a
    feuille: b contenu: xxxxxxyyyyy

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 28
    Points
    28
    Par défaut
    Je vais essayer l'indentation du 2ème fichier XML pour obtenir un fichier xml au 1er format qui devrait être parsé correctement

  5. #5
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    J'ai jamais eu de problèmes à parser un flux XML sans l'indentation qui est de toute façon optionnelle. Je sais pas quoi te dire à part ça.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Les deux fichiers sont équivalents, seule une bibliothèque buggée produirait des résultats différents.

    Je suggère de nous montrer le code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 28
    Points
    28
    Par défaut
    Avec plaisir
    la classe XmlTEST2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    package com.dom;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    public class XmlTEST2 {
     
    	/**
             * @param args
             */
    	private static String racineName;
    	private static DocumentBuilderFactory factory;
    	private static Element r;
    	private static NodeList children;
    	private static Racine racine;
    	// private static Element racine1;
     
    	private static List<ArbreElement> listElements;
     
    	public static void treatment(String racineName, NodeList nl, Noeud no) {
     
    		// racine = document.getDocumentElement();
    		// Noeud provenance = racine.getElementsByTagName("properties");
    		// racine1 = document.getDocumentElement();
    		// Noeud provenance = racine1.getElementsByTagName("properties");
     
    		for (int i = 0; i < nl.getLength(); i++) {
     
    			Noeud noeud;
    			Feuille feuille;
     
    			Node n = nl.item(i);
    //			System.out.println(n.getNodeName());
    			if (n.hasChildNodes() && n.getChildNodes().getLength() > 2
    					&& n.getNodeType() != 3) {
    				noeud = new Noeud(n.getNodeName());
    				treatment(racineName, n.getChildNodes(), noeud);
    				if (no == null)
    					listElements.add(noeud);
    				else
    					no.addElements(noeud);
     
    			} else if (n.hasChildNodes() && n.getChildNodes().getLength() <= 2) {
     
    				feuille = new Feuille(n.getNodeName().toString(), n
    						.getTextContent());
    				if (no == null)
    					listElements.add((ArbreElement) feuille);
    				else
    					no.addElements((ArbreElement) feuille);
     
    			} else if (n.getChildNodes().getLength() == 0
    					&& n.getNodeType() != 3) {
     
    				feuille = new Feuille(n.getNodeName().toString(), n
    						.getTextContent());
    				if (no == null)
    					listElements.add((ArbreElement) feuille);
    				else
    					no.addElements((ArbreElement) feuille);
    			}
    		}
    	}
     
    	public void lireRacine(List<ArbreElement> element) {
    		Iterator<ArbreElement> it = element.iterator();
    		while (it.hasNext()) {
    			Object o = it.next();
    			if (o instanceof Feuille)
    				System.out.println("Feuille: " + ((Feuille) o).getName()
    						+ " Contenu: " + ((Feuille) o).getValue());
    			else if (o instanceof Noeud) {
    				System.out.println("Noeud " + ((Noeud) o).getName());
    				lireRacine(((Noeud) o).elements);
    			}
    		}
    	}
     
    	public static void main(String[] args) {
    		try {
    			XmlTEST2 tst = new XmlTEST2();
    			factory = DocumentBuilderFactory.newInstance();
    //			factory.setNamespaceAware(true);
    //			factory.setValidating(false);
    			factory.setIgnoringElementContentWhitespace(true);
    			// factory.parse(new InpputSource(new InputStreamReader(inputStream,
    			// "<real encoding>")));
     
    			DocumentBuilder builder = factory.newDocumentBuilder();
     
    			File xml = new File("test.xml");
     
     
     
    //	        format.setLineWidth(65);
    //	        format.setIndenting(true);
    			Document document = builder.parse(xml);
     
    			r = document.getDocumentElement();
    //			NodeList myNL = document.getElementsByTagName ( "properties" ) ;
    //			NodeList myNL = r.getElementsByTagName ( "properties" ) ;
     
    			children = r.getChildNodes();
     
    			racineName = r.getTagName();
     
    			racine = new Racine();
    			listElements = new ArrayList<ArbreElement>();
    			treatment(racineName, children, null);
     
    			racine.setName(racineName);
    			racine.setElement(listElements);
     
    			System.out.println("début");
     
    			System.out.println("racine: "+racineName);
     
    			tst.lireRacine(racine.element);
     
    			System.out.println("Fin");
     
    		} catch (ParserConfigurationException pce) {
    			System.out.println("Erreur de configuration du parseur DOM");
    		} catch (SAXException se) {
    			System.out.println("Erreur lors du parsing du document");
    		} catch (IOException ioe) {
    			System.out.println("Erreur d'entrée/sortie " + ioe);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }
    la classe: ArbreElement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    package com.dom;
     
     
    public class ArbreElement {
     
        private String name;
     
    	/** Attributes **/
    	private String id;
     
    	private String label;
     
    	/** Constructor **/
    	public ArbreElement() {
     
    	}
     
    	/** getters and setters **/
    	public String getId() {
    		return id;
    	}
     
    	public void setId(String id) {
    		this.id = id;
    	}
     
    	public String getLabel() {
    		return label;
    	}
     
    	public void setLabel(String label) {
    		this.label = label;
    	}
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    }
    La classe Racine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package com.dom;
     
    import java.util.List;
     
    public class Racine extends ArbreElement {
     
     
    	public List<ArbreElement> element;
     
    	public List<ArbreElement> getElement() {
    		return element;
    	}
     
    	public void setElement(List<ArbreElement> element) {
    		this.element = element;
    	}	
     
    }
    La classe Noeud:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package com.dom;
     
    import java.util.ArrayList;
    import java.util.List;
     
     
    public class Noeud extends ArbreElement {
     
    	public List<ArbreElement> elements;
     
    	public Noeud(String name){
    		super();
    		elements=new ArrayList<ArbreElement>();
    		super.setName(name);
    	}
     
    	public List<ArbreElement> getElements() {
    		return elements;
    	}
     
    	public void setElements(List<ArbreElement> elements) {
    		this.elements = elements;
    	}
     
    	public void addElements(ArbreElement arbreElement){
     
    		this.elements.add(arbreElement);
    	}
     
    }
    La classe Feuille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    package com.dom;
     
    public class Feuille extends ArbreElement {	
     
    	private Object value;
     
    	public Feuille(String name,Object value) {
    		super();
    		super.setName(name);
    		this.value=value;
    	}
     
    	public Object getValue() {
    		return value;
    	}
     
    	public void setValue(Object value) {
    		this.value = value;
    	}
     
    }

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Points : 28
    Points
    28
    Par défaut
    Effectivement le problème c'était pas à cause de l'indentation. J'ai corrigé l'algorithme de parsing du fichier xml et ça marche très bien.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  2. [xslt] Parser 2 fichiers XML
    Par malekms dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/12/2005, 12h22
  3. Parser un fichier XML
    Par Charlinecha dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 11/07/2005, 17h18
  4. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  5. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo