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 :

Modification d'un noeud [XPATH]


Sujet :

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

  1. #1
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut Modification d'un noeud
    Bonjour,

    J'ai un fichier XML ou je souhaite modifier la valeur d'un noeud. J'utilise le package javax.xml.xpath. Je réussi à atteindre le noeud mais je n'arrive pas à modifier son contenu :
    - concaténation de la valeur précédente avec la nouvelle
    - le fichier n'est pas mis à jour.

    Voilà mon code Java :
    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
     
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.URL;
    import java.util.Iterator;
     
    import javax.xml.namespace.NamespaceContext;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
     
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.w3c.dom.Node;
    import org.xml.sax.InputSource;
    import org.xml.sax.XMLReader;
     
     
    public class NutStyle {
     
    	public NutStyle() throws XPathExpressionException, IOException, JDOMException {
     
            //création de la source
            InputSource source = new InputSource(getClass().getResourceAsStream("./nuts.xml"));
     
            //création du XPath 
            XPathFactory fabrique = XPathFactory.newInstance();
            XPath xpath = fabrique.newXPath();
     
            NamespaceContext namespace = new NamespaceContext(){
            	public String getNamespaceURI(String prefix){
            		if("Filter".equals(prefix)){
            			return "http://www.opengis.net/ogc";
            		}
            		else if("BBOX".equals(prefix)) {
            			return "http://www.opengis.net/ogc";
            		}
            		else if("Box".equals(prefix)) {
            			return "http://www.opengis.net/gml";
            		}
            		else if("coordinates".equals(prefix)) {
            			return "http://www.opengis.net/gml";
            		}
            		else{
            			return "http://www.opengis.net/sld";
            		}
            	}
            	public String getPrefix(String namespaceURI){
            		return null;
            	}
            	public Iterator getPrefixes(String namespaceURI){
            		return null;
            	} 
            };
            xpath.setNamespaceContext(namespace);
     
            XPathExpression exp = xpath.compile("StyledLayerDescriptor:*/NamedLayer:*/UserStyle:*/FeatureTypeStyle:*/Rule:*/Filter:*/BBOX:*/Box:*/coordinates:*");
            Node node = (Node)exp.evaluate(source,XPathConstants.NODE);
            System.out.println("node : "+node.getTextContent());
            node.setTextContent("2,3,4,5");
            System.out.println("node : "+node.getTextContent());        
    	}
     
    	public static void main(String[] args){
    		try {
    			new NutStyle();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    Je joins mon fichier XML (nuts.xml).

    Merci de votre aide !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    le fichier n'est pas mis à jour.
    Les modifications que tu fais (setTextContent) vont simplement modifier l'arbre en mémoire. Il te reste à écrire toi même cet arbre modifié dans un nouveau fichier.
    Pour celà, il y a des exemples dans la FAQ
    Bonne chance
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  3. #3
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    OK !! En plus je dois juste récupérer le Document, donc sur mon Node modifié je fais node.getOwnerDocument() et je l'ai !

    Mais qu'en est il du fait qu'au lieu de modifier la valuer du noeud, il concatène la valuer précédente avec la nouvelle ??

  4. #4
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut,
    il concatène la valuer précédente avec la nouvelle ??
    J'ai pas tout compris
    Tu veux dire prendre le contenu textuel du noeud et y ajouter "2,3,4,5" ?
    Si c'est ça, il te suffit d'utiliser getTextContent() et de faire la concaténation.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  5. #5
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Non moi je veux remplacer la valeur actuelle du noeud "1,45,2,46" par "2,3,4,5" mais la méthode setTextContent("2,3,4,5") me donne comme valeur : "1,45,2,462,3,4,5"...

  6. #6
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut,
    setTextContent("2,3,4,5") me donne comme valeur : "1,45,2,462,3,4,5"
    C'est a priori impossible, la méthode setTextContent() remplace totalement le contenu, elle ne fait pas de concaténation. Ou alors tu n'utilises pas les mêmes codes Java et XML que ceux donnés en exemple.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  7. #7
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Et bien non ce n'est pas impossible... si tu regardes le code que j'ai fourni tu verras que j'utilises la bonne méthode... peut être même que si tu as un peu de temps tu peux tester.
    C'est vraiment étrange mais ça me bloque. Une solution serait de vider le noeud pour remettre du contenu mais je n'y arrive pas non plus.

  8. #8
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    Bon je viens de comprendre mon erreur.... dans mon application j'ai un jar xmlparserv2-....jar : le parseur qui existe dans ce jar oracle.xml.jaxp.JXDocumentBuilderFactory est utilisé par défaut (fichier META-INF/services contenu dans le jar).
    Pour résoudre mon problème, c'est à dire pour forcer mon application à utiliser le parseur de ma JRE, il faut supprimer ce fichier du jar et ça fonctionne !!!

    Voilou !
    Merci en tout cas de ton aide vedaer !

  9. #9
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    En fait ce sujet n'est pas encore résolu...
    Voilà la fin de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Node node = (Node)exp.evaluate(source,XPathConstants.NODE);
            node.setTextContent("2,3,4,5");
            System.out.println(node.getTextContent());  // OK ! 
            Document doc = node.getOwnerDocument();
            System.out.println(doc.getTextContent());  // affiche [#document:null]
    Je ne comprends pas pourquoi la méthode getOwnerDocument me retourne null... Help !!!

  10. #10
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut,
    En fait ce sujet n'est pas encore résolu...
    On va y arriver

    Je ne comprends pas pourquoi la méthode getOwnerDocument me retourne null... Help !!!
    Elle ne te retourne pas null. Simplement la méthode toString() appliquée à ton document te donne "[#document:null]". Je te laisse lire la Javadoc pour savoir à quoi cela correspond exactement
    Pour te convaincre que ton document est bien modifié en mémoire, il te suffit de l'écrire sur la sortie standard. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    node.setTextContent("2,3,4,5");
     
            Source monDocumentModifie = new DOMSource(node.getOwnerDocument());
            Result sortieStandard = new StreamResult(System.out);
     
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
     
            transformer.transform(monDocumentModifie, sortieStandard);
    Pour revenir sur :
    Bon je viens de comprendre mon erreur.... dans mon application j'ai un jar xmlparserv2-....jar : le parseur qui existe dans ce jar oracle.xml.jaxp.JXDocumentBuilderFactory est utilisé par défaut (fichier META-INF/services contenu dans le jar).
    Pour résoudre mon problème, c'est à dire pour forcer mon application à utiliser le parseur de ma JRE, il faut supprimer ce fichier du jar et ça fonctionne !!!
    J'avais testé ton code, avec le fichier que tu as fourni, c'est pourquoi je me suis permis de dire ça
    Le problème venant d'une API externe dont l'implémentation est mauvaise (oracle.xml.jaxp.JXDocumentBuilderFactory), c'est l'occasion de faire un bug report. Les personnes qui la maintiennent pourront surement corriger le problème et ça évitera à d'autres d'avoir le même problème que toi.

    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  11. #11
    Membre régulier Avatar de wwave
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 84
    Points
    84
    Par défaut
    YES !!!
    Merci beaucoup !

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

Discussions similaires

  1. [JAXB] Modification d'un noeud xml
    Par electrovolt dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/07/2012, 10h26
  2. [SimpleXML] SimpleXMLElement modification d'un noeud
    Par alheim dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 21/05/2007, 21h48
  3. [C#] [1.1] Modification d'attributs d'un noeud XML
    Par Sup@Lou dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/08/2006, 16h35
  4. [XML] - Modifer un noeud
    Par jacquesh dans le forum Langage
    Réponses: 1
    Dernier message: 13/07/2006, 09h48
  5. JTree et modification des noeuds
    Par menuge dans le forum Composants
    Réponses: 2
    Dernier message: 05/05/2006, 08h55

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