Logo du forum
 

Forum TTH-News

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [Java] » Problème de Namespace
Login Mot de passe

2 visiteurs sur ce topic (0 membre(s), 2 invité(s) )


Auteur
Sujet : Problème de Namespace
Finch
Sage
Membre # 5042

 Avatar du membre
Lieu : belgique, Liège

Messages :
1772 (0.31 par jour)




Message du 24-04-2007 @ 11:23      Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   


Hello,

J'ai un problème lorsque j'essaye d'ajouter un nouveau noeud à un Document Dom.
Le contexte de mon problème se situe dans l'API Batik pour Java.
Mais mon problème ne vient pas directement d'elle mais bien de Dom.

Donc même si vous connaissez pas Batik, prenez le temps de lire ;-)

Contexte: J'essaye d'ajouter du nouveau contenu SVG (image sous forme xml) sous forme de String à un Document Dom qui existe déjà.
Problème: Le jsvgcanvas (classe qui gère l'affichage) ne se rafraichit pas a cause des namespaces.

Pour résumer:
Je lis un fichier à l'aide du jsvgcanvas:
svgCanvas.setURI(url);
Il m'affiche le fichier SVG à l'écran.
Quand tout est chargé, je récupère le Document Dom
Document document = svgCanvas.getSVGDocument();

J'ai essayé d'ajouter un nouvel élément avec les méthodes createElement et setAttribut. Ca n'a pas marché pas.
J'ai un peu regarder sur les mailing, il est impératif de préciser le namespace si on veut un rafraichissement.

J'essaye ça (ajoute un bete rectangle rouge):

String svgNS="http://www.w3.org/2000/svg";
Element rectangle = document.createElementNS(svgNS, "rect");
rectangle.setAttributeNS (null, "x", "1200");
rectangle.setAttributeNS(null, "y", "2200" );
rectangle.setAttributeNS(null, "width", "3100");
rectangle.setAttributeNS(null, "height", "3510");
rectangle.setAttributeNS(null, "style", "stroke: red; fill: red;");

a1.appendChild(rectangle); //ou a1 est le fils du root du document;

svgCanvas.setSVGDocument((SVGDocument)document);


Pouffff...ouéééé ca marche! Le truc se rafraichit et m'affiche un joli rectangle.

Mon problème c'est que:
1) Mon programme ne peut (malheuresement) pas se limiter a ajouter un simple rectangle
2) Il ne peut pas créer des éléments par CreateElementNS mais il doit récupérer une chaine de caractère d'élément svg qui ressemblerait à ça:

String s =
"



...
"

Je parse la String dans un nouveau document (newLayer). et là je rencontre un truc assez bizarre

Element newLayerRoot = (Element)newLayer.getDocumentElement(); //l'élément g de la chaine

System.out.println("Element:" + newLayerRoot.getTagName() + " Name:" + newLayerRoot.getAttribute("name") + " Namespace:" + newLayerRoot.getNamespaceURI());

Ca me donne "Element:g Name:test Namespace:null" // <=== null!!!!!

//ajoute le nouveau noeud au document principale
a1.appendChild(document.importNode(newLayerRoot, true));

//aucun rafraichissement...
svgCanvas.setSVGDocument((SVGDocument)document);

Bref il y vraiment un problème de Namespace!

De plus si je serialize le document final dans un fichier, tout est ok.
Sauf que l'élement g n'a pas de namespace (qu'il a perdu depuis le parsing):

...



...




Donc, j'en conclu qu'il y a un gros problème de namespace!
On m'a dit que c'était avant le parsing qu'il fallait le préciser.
Mais j'ai essayer de l'ajouter après "setAttribute("xmlns"....)" mais ca ne marche pas.

Bref, comment pourrais je faire pour (accrochez vous), à partir d'une chaine dont le root contient le namespace obtenir un nouveau document conforme, dont le root contient toujours le namespace après le parsing.

[message édité le 24-04-2007 @ 11:29 Par Finch]
----------
Qui prête à rire n'est jamais sûr d'être remboursé... [R. Devos]
- Haut de page -
Finch
Sage
Membre # 5042

 Avatar du membre
Lieu : belgique, Liège

Messages :
1772 (0.31 par jour)




Message du 24-04-2007 @ 15:26   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Problème résolu a coup de setNamespaceAware(true); dans le document builder ;)
----------
Qui prête à rire n'est jamais sûr d'être remboursé... [R. Devos]
- Haut de page -


Aller dans le forum :  

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2010

Valid XHTML 1.0 Transitional

Page générée en 0.028 secondes