SAXSVGDocumentFactory解析SVG时getAttribute()无法获取xlink:href属性
问题原因及解决方法
核心原因
这是因为xlink:href是带命名空间的属性,Batik库生成的SVGOMElement(即你获取到的image元素)的getAttribute()方法仅按「无命名空间的属性名」查找,无法识别带命名空间前缀的属性名。而遍历getAttributes()能找到目标属性,是因为该方法会返回所有属性,不受命名空间限制。
普通DocumentBuilder的DOM实现做了兼容处理,允许直接通过带前缀的属性名调用getAttribute()获取值,但Batik的DOM实现严格遵循XML命名空间规范,必须使用带命名空间的方法来读取这类属性。
解决方法
放弃使用getAttribute("xlink:href"),改用带命名空间的getAttributeNS()方法,指定xlink的标准命名空间URI和属性的本地名称:
// xlink的标准命名空间URI String XLINK_NS = "http://www.w3.org/1999/xlink"; // 获取xlink:href属性值 String hrefValue = image.getAttributeNS(XLINK_NS, "href");
通过这种方式就能正确获取到目标属性值。
额外注意点
如果你的SVG采用SVG 2.0规范(直接使用href而非xlink:href),直接调用getAttribute("href")即可;若需兼容旧版SVG,则必须区分命名空间处理。
内容的提问来源于stack exchange,提问作者Sadık
相关产品推荐
相关产品推荐

