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 =
"<g id="101" name="test" xmlns="http://www.w3.org/2000/svg">
<polyline points="8325 2232, 8325 2540" style="fill:none; stroke:rgb(255,000,000);"/>
<polyline points="7925 2232, 7925 2540" style="fill:none; stroke:rgb(255,000,000);"/>
<polyline points="7525 2232, 7525 2540" style="fill:none; stroke:rgb(255,000,000);"/>
...
</g>"
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):
<svg>
...
<g name="test" id="101">
<polyline style="fill:none; stroke:rgb(255,000,000);" points="8325 2232, 8325 2540"/>
<polyline style="fill:none; stroke:rgb(255,000,000);" points="7925 2232, 7925 2540"/>
...
</g>
</svg>
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é par finch911 le 24-04-2007 à 11:29:37