Атрибут запроса 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"
Другие вопросы по тегам