Hello,
I'm using batik 1.7 under windows, and I'm programming in java 5.0.
I'm trying to read the css style of elements (circle, rectangle....) contained
in an SVG file.
I can iterate through all these elements but I can't find their style.
Here is the code I'm using:
---------------------------
private void decodeFile() {
String mapFile = "D:/maps/rectangle.svg";
try {
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
String uri = new File(mapFile).toURI().toString();
Document doc = f.createDocument(uri);
SVGDocument svgDocument = (SVGDocument) doc;
SVGElement root = svgDocument.getRootElement();
parse(root);
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void parse(Node node) {
System.out.println("Name: " + node.getNodeName());
System.out.println();
StyleMap styleMap = null;
if (node instanceof SVGOMRectElement) {
styleMap = ((SVGOMRectElement) node).getComputedStyleMap(null);
}
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node childnode = (Node) nodeList.item(i);
parse(childnode);
}
}
---------------------------
Here is the SVG file:
---------------------------
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www..w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="10cm" height="5cm" viewBox="0 0 1000 500"
xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
<style type="text/css"><![CDATA[
rect {
fill: yellow;
stroke: blue;
stroke-width: 3
}
]]></style>
</defs>
<rect x="200" y="100" width="600" height="300" />
</svg>
---------------------------
The CSS style is defined in the def section and should apply to the whole
document (it is displayed correctly in firefox).
When
running the program, the rectangle element is correctly identified as a
SVGOMRectElement but getComputedStyleMap returns null.
Could you tell me how I could retrieve the style?
note 1:
I've also tried to use
CSSValue s =((SVGStylable)svgElement).getStyle().getPropertyCSSValue("fill");
but I'm getting a null pointer exception at
at
org.apache.batik.dom.svg.SVGStylableElement$StyleDeclaration.<init>(SVGStylableElement.java:645)
at
org..apache.batik.dom.svg.SVGStylableElement.getStyle(SVGStylableElement.java:256)
because cssEngine is null (but I don't know why and I'm not sure this is the
real cause of the problem).
note 2:
XMLResourceDescriptor.getXMLParserClassName() returns null so I've tried to
hardcode the parser class name
SAXSVGDocumentFactory f = new
SAXSVGDocumentFactory("org.apache..xerces.parsers.SAXParser");
but the result is the same.
Any help will be greatly appreciated.