2016-11-12 2 views
1

Я получил этот XML и просили указать, сколько элементов выражение возвращает:базы данных XPath запросов

<a> 
    <a> 
    <a>1</a> 
    <a>2</a> 
    </a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

Запросы XPath являются:

i) //a[a/text()=3]/a 

ii) //a[a/a/text()=3]/a/a 

iii) //a[a/text()=2][a/text()=3] 

И ответы даны I) 2, ii) 4, iii) 0

Однако у меня были проблемы при попытке понять это. Для i),

Что я понимаю, во-первых, я проверяю предикат. // означает потомок потомка или self, поэтому я проверяю // ////3. Поскольку я получил 3 в указанном пути,

<a> 
    <a> 
    <a>3</a> 
    <a>4</a> 
    </a> 
</a> 

так что предикат является истинным. Затем я выполнить XPath запросов, который // а/а, который будет возвращать мне 2 в этом блоке:

<a> 
    <a>3</a> 
    <a>4</a> 
</a> 

содержит 2 внутри. Тогда для ii) сначала проверяем предикат // a/a/a/3, то же самое, что и выше, я получил этот путь. Поскольку предикат возвращает true, поэтому я буду выполнять запрос XPath, например // a/a/a. Но она не должна возвращаться как 1, так как я смотрю на это:

<a> 
    <a> 
    <a>1</a> 
    </a> 
</a> 

Я действительно путают о том, как проследить его, и я уверен, что моя концепция не так, как ответ неверен. Есть ли простой способ сделать это или, может быть, несколько лучших примеров?

Заранее благодарен!

ответ

2

В качестве примера я попытаюсь объяснить первый XPath. Проверьте свое понимание после прочтения этого ответа, применив то, что вы только что поняли, к остальной части XPath.

  • //a: найти всеa элементы, в любом месте в документе. До этого момента будет возвращено 7 элементов.
  • [a/text()=3]: фильтровать a элементов, найденных в предыдущем XPath для тех, кто имеет дочерний элемент a, где один из ребенка текстового узла равен 3. До этого момента будет возвращен только один элемент; родительский от <a>3</a>.
  • /a: вернуть дочерний элемент a от <a>3</a> элемент, найденный в предыдущем XPath. Это означает, что весь XPath вернет 2 элемента, так как есть два элемента a, которые являются дочерними по отношению к родителям <a>3</a>.

Demo 1

выход:

<a>3</a> 
<a>4</a> 

ОБНОВЛЕНИЕ:

Только что понял, что вас путают со вторым XPath, а не с 1-м. Но ваше понимание о первом также немного не работает, поэтому я ожидаю, что первоначальный ответ по-прежнему будет полезен. Вот краткое объяснение о 2-ой XPath:

  • //a: найти всеa элементы, в любом месте в документе. До этого момента будет возвращено 7 элементов.
  • [a/a/text()=3]: выражение в предикате будет соответствовать родительскому элементу <a>3</a>. Таким образом, весь XPath до этого момента будет соответствовать только одному элементу; Корневой элемент.
  • /a/a: из корневого элемента, найденного предыдущим XPath, верните все элементы большого размера a. Таким образом, весь XPath возвращает 4 элемент

Demo 2

+0

спасибо за объяснение! Но просто быстрая проверка с вами по поводу последнего вопроса, поэтому // возвращает 7 элементов. Тогда первый предикат в основном найдет тот, у которого текстовый узел равен 2, в этом случае я остаюсь с родителем только . Затем, после этого, я выполняю еще один предикат, чтобы найти 3, но так как я остался с родителем 2, а 3 - у другого родителя, поэтому я не могу найти его и, таким образом, вернуть 0? Я на правильном пути? –

+0

@WhoamI вот ты иди! Вот как работает последний XPath. Congrats! – har07

Смежные вопросы