Bonjour à tous,

J'ai récemment débuté dans l'utilisation de batik pour lire des images svg mais j'ai des soucis pour récupérer à l'intérieur une balise en particulier.

Code java : 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 batik.test;
 
import java.io.File;
import java.io.IOException;
 
import javax.xml.xpath.XPathExpressionException;
 
import org.apache.batik.dom.AbstractDocument;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGElement;
import org.w3c.dom.xpath.XPathResult;
 
public class CreateDocFromSVGFile {
 
	public static void main(String[] args) throws XPathExpressionException {
 
		try {
		    String parser = XMLResourceDescriptor.getXMLParserClassName();
		    SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
		    File file = new File("C://SVGs_input//figure_text.svg");
		    String uri = file.toURI().toString();
		    Document doc = f.createDocument(uri);
		    SVGDocument svgDocument = f.createSVGDocument(uri);
 
		    AbstractDocument ab = (AbstractDocument) svgDocument;
		    XPathNSResolver resolver = ab.createNSResolver(ab.getDocumentElement());
		    XPathResult result = (XPathResult) ab.evaluate("//text", svgDocument.getDocumentElement(), resolver, XPathResult.ANY_TYPE, null);
		    Node node = result.iterateNext();
		    while (node != null) {
		    	System.out.println("<" + node.getNodeName() + "> " + node.getTextContent());
		    	node = result.iterateNext();
		    }
 
		} catch (IOException ex) {
		    ex.printStackTrace();
		}
	}
 
}

L'expression "//*" me retourne bien toutes les balises mais dès que j'essaye autre chose de spécifique comme //title ou //text je n'obtiens rien du tout.

Je sais que le problème vient du namespace par défaut (xmlns:"http://www.w3.org/2000/svg") et j'ai réussi en passant par jdom à obtenir ce que je voulais grâce à l'expression "//svg:text" mais cela ne marche pas avec batik.

Je mets à disposition le fichier svg que l'on trouve sur la page de présentation de svg sur wikipédia :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="300" height="200">
  <title>Exemple simple de figure SVG</title>
  <desc>Cette figure est constituée d'un rectangle, d'un segment de droite et d'un cercle.</desc>
 
  <rect width="100" height="80" x="0" y="70" fill="green" />
  <line x1="5" y1="5" x2="250" y2="95" stroke="red" />
  <circle cx="90" cy="80" r="50" fill="blue" />
   <text x="180" y="60">Un texte</text>
   <text x="180" y="60">Un autre texte</text>
</svg>
Et le résultat avec "//*" en expression :

svg
title
desc
rect
line
circle
text
text

Merci d'avance