gpt4 book ai didi

java - 使用 Batik 从 SVG 中使用 XPath 获取特定元素

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:18 25 4
gpt4 key购买 nike

我正在尝试使用 Batik 从 SVG 文档中查找一些元素。

这是我正在使用的示例 SVG 文档:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.0"
width="400"
height="300"
viewBox="0 -100 400 300"
preserveAspectRatio="none"
id="svg2">

<g id="blubb">
<line x1="0" y1="0" x2="40" y2="120" stroke="red" stroke-width="3"/>
<text class="hurz" x="50" y="150">HURZ!</text>
</g>
</svg>

我正在尝试查找所有具有类属性 hurztext 元素。

这是一个示例代码:

import java.awt.*;
import java.io.*;
import javax.swing.*;
import org.apache.batik.swing.*;
import org.apache.batik.swing.gvt.*;
import org.w3c.dom.*;
import org.w3c.dom.svg.*;
import org.w3c.dom.xpath.*;

public class XPathTest extends JFrame {
private final JSVGCanvas c= new JSVGCanvas();


public XPathTest(){
this.setLayout(new GridLayout());
this.add(c);

c.setURI(new File("/tmp/bla.svg").toURI().toString());

c.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
@Override
public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
testXPath();
}
});
}

private void testXPath() {
final SVGDocument document= c.getSVGDocument();
final XPathEvaluator xpathEvaluator= (XPathEvaluator) document;
final SVGElement searchRoot= (SVGElement) document.getElementById("blubb");

//works
final XPathResult result1= (XPathResult) xpathEvaluator.evaluate(".//*[@class=\"hurz\"]", searchRoot, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
printResults(result1);

//doesn't work
final XPathResult result2= (XPathResult) xpathEvaluator.evaluate(".//text[@class=\"hurz\"]", searchRoot, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
printResults(result2);

//doesn't work
final XPathResult result3= (XPathResult) xpathEvaluator.evaluate(".//text", searchRoot, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
printResults(result3);
}

private void printResults(XPathResult result){
int count= 0;

Node node;
while ((node= result.iterateNext()) != null) {
count++;
}

System.out.println(count);
}

public static void main(String[] args){
final XPathTest f= new XPathTest();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 600);
f.setVisible(true);
}
}

运行时,输出为:

1
0
0

很明显,XPath 表达式 .//*[@class="hurz"] 找到了正确的节点。但是,当我搜索特定的元素类型(在本例中为 text 元素)时,它找不到表达式 .//text[@class="hurz"].//text.

是我做错了什么还是 Batik 中的错误?

最佳答案

这是因为默认命名空间 xmlns="http://www.w3.org/2000/svg"。尝试使用 local-name() 函数:

.//*[local-name()=\"text\" and @class=\"hurz\"]

关于java - 使用 Batik 从 SVG 中使用 XPath 获取特定元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26114760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com