Aide - Recherche - Membres - Calendrier
Version complète : XPath sur un élément à namespace par défaut
Forum Développeur - Administration serveur, programmation et base de données > Programmation > XML et XSL
wox-xion
Voilà, j'ai ma classe suivante en java : (je mets la balise pour l'as, pour mieux voir)
ActionScript
/*
* Dom4JTest.java
*
* Created on 4. janvier 2005, 00:01
*/

 
package net.jwxs.ida;
 
import java.io.*;
import java.util.List;
import java.lang.NullPointerException;
import java.lang.StringBuilder;
// dom4j
import org.dom4j.*;
import org.dom4j.io.*;
 
/**
*
* @author xion
*/

public class Dom4JTest{

/** Creates a new instance of Maps */
public Dom4JTest(Document xml)
throws DocumentException, NullPointerException{
trace(xml.selectSingleNode("//map").asXML());
trace("test running");
}
public static void main(String[] args){
String xml = "<wxmap xmlns='base'> <headers>header</headers> <core><define>definition</define><map level='5'><![CDATA[map]]></map><events>event</events></core><footer /></wxmap>";
try{
Dom4JTest var = new Dom4JTest(parse(xml));//(parseXml("./wxmap/maps/newrelease-alpha.wxmap"));
}catch(Exception e){
e.printStackTrace();
}
}
private static Document parseXml(String file)
throws FileNotFoundException, DocumentException{
SAXReader xmlReader = new SAXReader();
return xmlReader.read(file);
}
private static Document parse(String map) throws DocumentException {
return DocumentHelper.parseText(map);
}
private void trace(String info){
System.out.println(info);
}
}


-si, au noeud racine(wxmap), je ne mets pas de namespace du tout, aucun problème, ça marche (mais c'est pas validable donc je veux pas de cette solution)
-si, au noeud racine, je mets un namespace genre <wx:wxmap xmlns:wx='base'> et que je le mets sur les éléments, ça marche, mais franchement, c'est pas le top et étant donné que c'est pour des fichiers bien plus compliqués, je n'ai pas du tout d'intérêt à faire ça... surtout que xml définit xmlns pour le namespace par défaut
et c'est là que ça coince... sad.gif
-si, au noeud racine, j'attribue un namespace par défaut genre <wxmap xmlns='base'> et bien je ne peux plus accéder à quelque node que ce soit mis à part les attributs et le node racine sad.gif :'(
comment accéder à l'élément <map> par exemple ?? //map n'est pas valide, ça me renvoie une NullPointerException....
j'y accède comment alors ?

j'ai cherché pour mon problème un peu partout dont ceci :
http://www.biglist.com/lists/xsl-list/arch...3/msg01085.html (mais ça m'aide pas, et le posteur non plus n'a pas du trouver de solution à la base)
sinon http://www.mail-archive.com/dom4j-dev@list...t/msg00501.html un peu différent, mais très proche
liguorien
je ne comprends pas trop ce que tu essais de faire ? icon_rolleyes.gif

le namespace par défaut dans un document est une chaine vide. Si tu changes le namespace par défaut, il sera attribué à tous les éléments qui n'ont pas de namespace explicite... Donc pour accéder à l'élément par un XPath il faut le cibler avec base:map

Pourquoi veux-tu absolument utiliser les namespace ?

dernière chose, l'utilisation de l'opérateur // est déconseillé à moins que son comportement soit vraiment voulu. C'est un peu comme le .* des regex wink.gif
wox-xion
liguorien (Jul 13 2005, 06:43 PM) a dit :
je ne comprends pas trop ce que tu essais de faire ? icon_rolleyes.gif

le namespace par défaut dans un document est une chaine vide. Si tu changes le namespace par défaut, il sera attribué à tous les éléments qui n'ont pas de namespace explicite... Donc pour accéder à l'élément par un XPath il faut le cibler avec base:map

Pourquoi veux-tu absolument utiliser les namespace ?

dernière chose, l'utilisation de l'opérateur // est déconseillé à moins que son comportement soit vraiment voulu. C'est un peu comme le .* des regex wink.gif
*



quand tu dis base:map, tu fais référence à mon code ?
car ça ne marche pas et c'est normal :
"netbeans" a dit :
org.dom4j.XPathException: Exception occurred evaluting XPath: //base:map. Exception: XPath expression uses unbound namespace prefix base
        at org.dom4j.xpath.DefaultXPath.handleJaxenException(DefaultXPath.java:374)
        at org.dom4j.xpath.DefaultXPath.selectSingleNode(DefaultXPath.java:173)
        at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:185)
        at net.jwxs.ida.Dom4JTest.<init>(Dom4JTest.java:26)
        at net.jwxs.ida.Dom4JTest.main(Dom4JTest.java:32)


base n'est pas le lien du namespace, or via XPath, c'est via le lien du namespace que j'identifie le namespace, genre dans <wxmap xmlns:wx="base" />, c'est :
/wx:wxmap et non /base:wxmap wink.gif
donc dans mon exemple, comment arriver à cibler map sans enlever le namespace par défaut ?

ps : en fait je n'ai pas l'intention de changer un namespace ou d'en attribuer, il est déjà dans le xml, mon problème est d'accéder à un élément du xml dont le namespace est celui par défaut qui EST définit à la racine... c'est impossible ?
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.