【发布时间】:2014-08-10 15:24:09
【问题描述】:
我创建了一个 Java 应用程序来修改一些 SVG 文件。 这是我的问题: 我想向我的 SVG 文件的 DOM 添加一个元素以在矩形上创建链接。 SVG 文件是从另一个应用程序生成的。 我需要用 Java 来做。
这就是我所做的:
- 我使用 JASXP 尝试解析和修改我的 SVG 文件。
我尝试了许多配置,使用 SAX、DOM API 来解析它,这是我成功地从我的 SVG 文件创建文档的唯一方法。
这是我的 SVG 文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg ... xmlns:xlink="http://www.w3.org/1999/xlink" ....xmlns="http://www.w3.org/2000/svg" ...>
<!--Generated by the Batik Graphics2D SVG Generator-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
....define the clipath...
</defs>
HERE I WOULD LIKE TO INSERT OPEN A ELEMENT : <a ....>
<g font-size="11" transform="translate(2,212)" fill-opacity="1"fill="rgb(192,255,255)" text-rendering="geometricPrecision" font-family="sans-serif" stroke="rgb(192,255,255)" font-weight="bold" stroke-opacity="1">
<rect x="0" width="80" height="40" y="0" clip-path="url(#clipPath1)" stroke="none"/>
</g>
<g font-size="11" stroke-linecap="butt" transform="translate(2,212)" fill-opacity="1" fill="black" text-rendering="geometricPrecision" font-family="sans-serif" stroke-linejoin="round" stroke="black" font-weight="bold" stroke-opacity="1" stroke-miterlimit="0">
<rect fill="none" x="0" width="80" height="40" y="0" clip-path="url(#clipPath1)"/>
</g>
<g font-size="11" transform="translate(2,212)" fill-opacity="1" fill="black" text-rendering="geometricPrecision" font-family="sans-serif" stroke="black" font-weight="bold" stroke-opacity="1">
<text x="28" xml:space="preserve" y="12" clip-path="url(#clipPath4)"stroke="none" >Titre</text>
<line y2="12" fill="none" x1="28" clip-path="url(#clipPath4)" x2="52" y1="12"/>
</g>
</g>
</svg>
AND I WOULD LIKE TO CLOSE IT here : </a>
从我的 SVG 获取 DOM 文档的代码:
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
File file = new File ("D:/mySVGFile.svg");
String uri = file.toURI().toString();
Document doc = f.createDocument(uri);
为了解析文档,我这样做了:
Element racine = doc.getDocumentElement();
String tag ="text"; // Because it's the only element I have store in an Array
NodeList liste = doc.getElementsByTagName(tag);
Element e = (Element) liste.item(0); // element text = Titre
Node target = e.getParentNode().getParentNode().getParentNode();
Element link = doc.createElement("a");
link.setAttribute("xlink:href", "DestinationFile.svg#67");
target.insertBefore(link, target);
这是控制台错误:
org.w3c.dom.DOMException: The child node (type: 1, name: svg) is missing.
at org.apache.batik.dom.AbstractNode.createDOMException(AbstractNode.java:408)
at org.apache.batik.dom.AbstractParentNode.insertBefore(AbstractParentNode.java:78)
at SAXTagCount.main(SAXTagCount.java:60)
事实上,我真的不知道如何在 Java 中为 SVG 文件创建这个元素。
提前感谢您的帮助!
吉姆
【问题讨论】: