Извлечь элемент Java на основе его соответствующего элемента XML

У меня есть XML-файл, полученный из входного файла Java. у меня тоже есть xPath выражения для файла 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: результат должен быть узлом в дереве абстрактного синтаксиса. У меня есть АСТ, созданный с помощью ложки. Поэтому в приведенном выше примере я хочу извлечь связанные CtMethodImpl,

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

1 ответ

Насколько я знаю, "прямого" способа сделать это не существует.

Это: "//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;
    }
}
Другие вопросы по тегам