基于其对应的XML元素提取Java元素

时间:2015-06-06 10:07:25

标签: java xml xpath abstract-syntax-tree inria-spoon

我有一个由输入java文件生成的XML文件。我还有XML文件的xPath个表达式。

我需要一个接收一个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元素。

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

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

1 个答案:

答案 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;
    }
}