0

我有一个由输入 java 文件产生的 XML 文件。我也有xPathXML 文件的表达式。

我需要一个函数来接收一个 xPath 表达式并返回它的 java 元素(在抽象语法树中)。我尝试了以下代码:

  1. 首先根据输入的 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);
    
  2. 但是,我不知道如何将提取XML的节点链接到源代码中的 Java 元素。

PS:reslut应该是抽象语法树中的一个节点。我有勺子创建的 AST 。因此,在上面的例子中,我想提取相关CtMethodImpl的 .

node.getTextContent()不是答案,因为可能有多个实例具有相似的文本内容。

4

1 回答 1

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;
    }
}
于 2015-12-15T09:21:26.423 回答