【问题标题】:Java does not bringing back any value from SVGJava 没有从 SVG 中带回任何价值
【发布时间】:2015-01-05 16:26:32
【问题描述】:

通常使用 Dom4J 从 XML 文件中获取属性值是没有问题的

在 XML 工具中,我也可以使用 xsl 和 Xpath 从该 SVG 中获取“使用填充”的值

<svg xmlns="http://www.w3.org/2000/svg" width="2250" height="2700" viewBox="0 0 1800 2160" color-interpolation-filters="sRGB" fill="none" overflow="visible" fill-rule="evenodd" stroke-linecap="square" stroke-miterlimit="3" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="translate(363.17-1988.15)">
    <use fill="#f00" xlink:href="#1"/>
    <g transform="translate(72.59-8.504)">
        <use xlink:href="#9"/>
        <use xlink:href="#B"/>
        <use xlink:href="#A"/>
    </g>
    <text x="25.29" y="2143.97" fill="#000" font-family="Arial" font-size="8">SetAnnotations</text>
</g>

例如在 xmlSpy 中工作

/svg/g/use/@fill 或 //g[text="SetAnnotations"]/use/@fill

这(以及我尝试过的所有其他方法)在 Java 中都失败了(通常有效)

    public static String getNodeValue(Element doc, String xpath){
    try{
        return doc.selectSingleNode(xpath).getText();
    }catch (Exception ex){
        log.debug("getNodeValue failed with " + ex.getMessage());
        return null;
    }
}

public static String getAttributeValue(Element doc, String xpath, String attributeName){
    try{
        Node node = doc.selectSingleNode(xpath);
        String value = node.valueOf(attributeName);
        return value;
    }catch (Exception ex){
        log.debug("getAttributeValue failed with " + ex.getMessage());
        return null;
    }
}

由于某些原因,我只能使用 1.5 + dom4J,但由于 svg 已经很老了,我希望有一个没有像蜡染这样的额外库的解决方案

知道如何在 Java 中正确使用 svg(读取和更改属性)吗?

提前感谢任何提示

【问题讨论】:

    标签: java xpath svg


    【解决方案1】:

    我认为you've been told already that SVG documents might have a default namespace


    但由于我还是在写:您的 SVG 文档有一个您需要考虑的 默认命名空间。以下 XPath 表达式将起作用:

    /*[local-name()= 'svg']/*[local-name() = 'g']/*[local-name() = 'use']/@fill
    

    //*[local-name() = 'g'][*[local-name() = 'text']="SetAnnotations"]/*[local-name() = 'use']/@fill
    

    或者,更好的是,注册或声明此命名空间并在路径表达式中为元素名称添加前缀。

    【讨论】:

    • 谢谢,出于某种奇怪的原因,只有第一个在 Java 中带回了结果。如何注册和声明命名空间?
    • @user3732793 现在第二个应该也可以了。我不熟悉 Dom4J - 我们将不得不等待熟悉的人。但也许它类似于:stackoverflow.com/questions/14317384/…?
    • 是的,效果很好,我希望我可以自己修改属性。非常感谢!
    • 是的,你提到的另一个线程谈到了一个类似的话题......对不起,我之前没有找到它
    猜你喜欢
    • 2013-11-18
    • 2022-12-03
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2022-07-29
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多