Как можно отождествить несколько элементов с тем же именем в XPath?

Если вы ищете исходный список для группировки в Карту Карт. Ниже приведен фрагмент кода

    List<FullCalendarDTO> arrayList = new ArrayList<FullCalendarDTO>();
    arrayList.add(new FullCalendarDTO("US","A"));
    arrayList.add(new FullCalendarDTO("EU","A"));
    arrayList.add(new FullCalendarDTO("EU","A"));
    arrayList.add(new FullCalendarDTO("US","A"));
    arrayList.add(new FullCalendarDTO("US","B"));

    Map<String, List<FullCalendarDTO>> result = arrayList.stream().collect(Collectors.groupingBy(FullCalendarDTO::getNameOfCountryOrRegion));

    HashMap<String, Map<String, List<FullCalendarDTO>>> finalOutput = new HashMap<String, Map<String, List<FullCalendarDTO>>>();
    for (Entry<String, List<FullCalendarDTO>> fullCalendarDTO : result.entrySet()) {
        Map<String, List<FullCalendarDTO>> collect = fullCalendarDTO.getValue().stream().collect(Collectors.groupingBy(FullCalendarDTO::getLeagueDTO));
        finalOutput.put(fullCalendarDTO.getKey(), collect);
    }

    System.out.println(finalOutput);

, который выводит

{EU = {A = [EU :: A, EU :: A]}, US = {A = [US :: A, US :: A], B = [US :: B]}}

9
задан Cœur 3 September 2017 в 11:37
поделиться

1 ответ

[ ] имеет более высокий приоритет, чем//(и "//" на самом деле только сокращение, не оператор). Это так, потому что согласно спецификации XPath 1.0,

"//коротко для/descendant-or-self:: узел () /"

и позже:

"ПРИМЕЧАНИЕ: путь местоположения//para1 не означает то же как путь местоположения / потомок:: para1. Последние выборы первый порожденный элемент параграфа; первый выбирает все порожденные элементы параграфа, которые являются первыми детьми параграфа их родителей".

Поэтому выражение XPath:

    //element[@name='same'][2]

средства:

Выберите любой элемент в документе, который называют "элементом", имеет атрибут "имя" со значением "то же", и этот элемент является вторым такой ребенок своего родителя.

То, что Вы хотите:

    (//element[@name='same'])[2]

Отметьте скобки, которые переопределяют более высокий приоритет [].

Точно так же предпоследнее такой узел выбрано следующим выражением XPath:

    (//element[@name='same'])[last()-1]

Наконец, необходимое предупреждение: использование "//" сокращение является очень дорогим, поскольку оно заставляет целое (sub) дерево быть пересеченным. Каждый раз, когда структура документа известна, рекомендуется использовать более определенные конструкции (пути местоположения).

20
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: