Атрибут запроса jXPath в суперклассе
У меня есть пара классов домена, которые все наследуют класс BaseDomain.
В этом классе BaseDomain у меня есть поле, которое является публичным конечным именем String;
Значение имени задается в конструкторе.
public class BaseDomain {
public final String name;
public BaseDomain() {
this.name = this.getClass().getCanonicalName();
}
}
Этот базовый домен расширен несколькими классами
public class Trip extends BaseDomain {
private int id;
public Trip(int id){
this.id = id;
}
}
Все идет нормально.
Я хочу получить значение поля "имя" в экземпляре объекта Trip a с помощью JXPath, но не могу. Я могу получить доступ к полю "id", но не к полю "name".
JXPathContext jxPathContext = JXPathContext.newContext(trip);
jxPathContext.setLenient(true);
int id = (int)jxPathContext.getValue("/@id"); // This works.
String name = (String)jxPathContext.getValue("/@name"); // This does not work.
Можно ли получить значение "имя" с этой настройкой и JXPath?
Код может иметь некоторые синтаксические ошибки и / или другие ошибки. Я надеюсь, что вы все поняли идею и поняли мой вопрос.
Любая помощь или указатель приветствуются.
Первое: я хочу поблагодарить Келли С. Френч за его быстрое воспроизведение. Это заставило меня понять, что я должен объяснить еще немного.
Я хочу использовать jxpath, потому что в конечном итоге я сделаю более глубокий поиск. Например: Trip может содержать список Locations, который также расширяет BaseDomain. Каждое расположение может содержать список PointOfInterest, который расширяет BaseDomain.
С помощью отражения в другой части кода я хочу получить список BaseDomain в зависимости от их типа (class.getCanonicalName())
Дерево объектов не основано на xml, оно чисто POJO.
Насколько я понял, нет способа написать jxpath-запрос для поиска списка объектов на основе их типа, имени класса и так далее.
Это правильно? Кто-нибудь знает способ сделать это?
Самый простой выход, даже если это некрасиво, состоит в том, чтобы в суперклассе было поле с именем класса. Вот почему я сделал это уродливое решение.
В конце концов я хочу создать jxpath-запрос, который на основе поездки возвращает итератор, для которого когда-либо объект, который является экземпляром BaseDomain на любой глубине, и не зависит от того, в какой ветви дерева объектов расположен узел, пока я могу получить имя класса объекта, который я ищу.
Кто-нибудь знает, возможно ли достичь этого с помощью jxpath-запроса?
Пример кода, ссылки на блоги или другую документацию приветствуются и приветствуются.
Как и прежде, я очень благодарен за любую помощь.
1 ответ
Если у вас есть экземпляр поездки, почему вы не можете сделать это
string n = trip.name;
Я вижу, что у вас есть XML-представление поездки, но использование XPath будет полезно, когда у вас есть только XML для "поездки".
Если вам все еще нужно получить имя с помощью XPath, опубликуйте сгенерированный XML. Я был бы готов поспорить, что атрибут name не является частью Trip, а является частью включающего BaseDomain. Если вы основываете jxPathContext в Trip, вы уже прошли узлы для BaseDomain. Вам придется как-то перейти обратно (например, node.parent) или сделать это при создании контекста,
// not sure about this approach
JXPathContext jxPathContext = JXPathContext.newContext(trip.super);
Посмотрев руководство JXPath по отношениям родитель / потомок, почему бы вам не попробовать это:
String name = (String)jxPathContext.getValue("/Trip/../@name");
// or use "../@name", not sure it wouldn't need to be "/../@name"