Извлечь элемент Java на основе его соответствующего элемента XML
У меня есть XML-файл, полученный из входного файла Java. у меня тоже есть xPath
выражения для файла XML.
Мне нужна функция, которая получает одно выражение xPath и возвращает его элемент Java (в абстрактном синтаксическом дереве). Я попробовал следующий код:
Сначала извлеките элемент 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);
Тем не менее, я не знаю, как ссылки извлечены
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;
}
}