2015-06-06 66 views
0

我有一个输入java文件导致的XML文件。我还有用于XML文件的xPath表达式。基于其相应的XML元素提取Java元素

我需要一个接收一个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应该是在抽象语法树的节点。我有由spoon创建的AST。因此,在上面的例子中,我想提取相关的CtMethodImpl

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

+0

什么抽象语法树?什么Java元素?正如所写,你的问题是无法回答的。请用您的输入示例进行编辑,并输入您想要输出的示例。 – kdgregory

回答

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