Как запросить XML внутри тега?

Я пытаюсь запросить значение для местоположения с тегом атрибута в моем xml ниже. Как я могу это сделать?

Мой текущий запрос возвращает только значение для полного тега атрибута, но я хочу только значение для местоположения, которое в этом случае является "sampleLocation"?

то есть: location="sampleLocation"

XML:

<Products>
    <Product>
        <name>Sample name</name>
        <attribute id="sampleid" location="sampleLocation" type="sampleType"/>
    </product>
</Products> 

Текущий код:

  public String getLocationByName(String name) {
        final String nameToQueryFor = name;
        return engine.new Query<String>(MY_COLLECTION) {

            @Override
            protected String query(Collection collection) throws Exception {
                XQueryService service = queryService();

                ResourceSet resourceSet = service.query(
                        format("//Products/Product[name='%s']" +
                                        "/attribute"
                                , StringEscapeUtils.escapeXml(nameToQueryFor)
                        ));

                List<String> results = newArrayList();

                for (String resource : new IterableStringResources(resourceSet)) {
                    results.add(resource);
                }
                return results.get(0);
            }
        }.execute();
    }

3 ответа

Решение

Я смог решить эту проблему, используя следующий запрос:

"//Products/Product[name='%s']/attribute/@Location/string()"

который возвращает: "sampleLocation"

Примечание: без использования /string() в конце это дало ошибку:

attribute 'Location' has no parent element

Мое предложение

//Product[child::name/text()={$nameToQueryFor}]/attribute/@location

Это будет работать только тогда, когда переменная связана со значением для типа элемента

[Отредактировано для "местоположения" + коррекция]

"//Products/Product/name[text()=%s]/next-sibling::attribute/a‌​ttribute::location"

Перевод: в контексте //Products/Product выберите элемент <name> с заданным текстом. Затем возьмите следующий элемент родного брата с <attribute> тип, из которого получают значение location атрибут (этого элемента)

Некоторые примеры "путей локации xpath" прямо изо рта лошади.

Другие вопросы по тегам