我有一个由输入java文件生成的XML文件。我还有XML文件的xPath
个表达式。
我需要一个接收一个xPath表达式并返回其java元素的函数(在抽象语法树中)。我尝试了以下代码:
首先根据输入的xPath表达式提取XML元素。
XPath xPath = XPathFactory.newInstance().newXPath();
String query = "//unit[1]/unit[1]/class[1]/block[1]/function[6]"; //a method
Node node = (Node) xPath.compile(query).evaluate(XmlDocument, XPathConstants.NODE);
但是,我不知道如何将源代码中提取的XML
节点链接到Java元素。
PS:
reslut应该是抽象语法树中的节点。我有spoon创建的AST。因此,在上面的示例中,我想提取相关的CtMethodImpl
。
node.getTextContent()
不是答案,因为可能存在多个具有相似文本内容的实例。
答案 0 :(得分:0)
据我所知,没有“直接”的方式来做到这一点。
这个:"//unit[1]/unit[1]/class[1]/block[1]/function[6]"
就是我们所说的签名,因为它唯一地标识了一个元素(不知何故)。
我要做的是创建一个勺子处理器并通过整个AST检查每个元素,看它是否与签名匹配。
public class ProcessorExample <E extends CtElement> extends AbstractProcessor<E> {
HashMap<String, Node> nodes;
//Sets your XML Nodes here, sorted by signature
public void setNodes(HashMap<String, Node> nodes) {
this.nodes = nodes;
}
@Override
public void process(E element) {
if (nodes.containsKey(signature(element))) {
Node n = nodes.get(signature(element));
//YOU FOUND IT!
}
}
private String signature(E element) {
//YOU MUST PROVIDE THIS IMPLEMENTATION
//TO MATCH YOUR "//unit[1]/unit[1]/class[1]/block[1]/function[6]"
//KIND OF SIGNATURE
return null;
}
}