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 :
Et le résultat avec "//*" en expression :
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>
svg
title
desc
rect
line
circle
text
text
Merci d'avance![]()
Partager