2015-06-06 64 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; 
    } 
}