2015-06-06 1 views
0

У меня есть XML-файл, полученный из входного java-файла. У меня также есть выражения xPath для файла XML.Извлечь элемент Java на основе его соответствующего элемента XML

Мне нужна функция, которая получает одно выражение xPath и возвращает его элемент java (в абстрактном синтаксическом дереве). Я попробовал приведенный ниже код:

  1. Первый фрагмент XML-элемента на основе входного выражения xPath.

    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. Поэтому в приведенном выше примере я хочу извлечь связанные CtMethodImpl.

node.getTextContent() не является ответом, поскольку возможно, что имеется более одного экземпляра с похожим текстовым контентом.

+0

Какое абстрактное синтаксическое дерево? Какой элемент Java? Как написано, ваш вопрос неопровержимо. Измените его на примере вашего ввода и пример того, что вы хотите для вывода. – kdgregory

ответ

0

Насколько я знаю, нет «прямого» способа сделать это.

Это: "//unit[1]/unit[1]/class[1]/block[1]/function[6]" - это то, что мы называем сигнатурой в том смысле, что оно однозначно идентифицирует элемент (каким-то образом).

Что бы я сделал, это создать процессор ложки и пройти через весь АСТ, проверяя каждый элемент, чтобы убедиться, что он соответствует сигнатуре.

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