2017-02-13 11 views
1

Я хочу, чтобы выбрать все Кассиопеян в B для следующего образца XML:Выбрать первые ребенок

<A> 
    <B> 
    <C>want this</C> 
    <C>don't want this</C> 
    </B> 
    <B> 
    <C>want this, too</C> 
    <C>still don't want this</C> 
    </B> 
<C>definitely don't want this, or any other c</C> 
</A> 

Как это возможно? Я попробовал //B/C[1], но он вернул только первый элемент. В образце XML я помещаю C вне B, потому что C - это действительно общие элементы, которые могут существовать и в других местах.

Редактировать: Было бы неплохо, если бы xpath мог быть расширен таким образом, чтобы я мог также получить всех вторых детей из B, потому что мне это тоже нужно.

+0

Попробуйте '// B/C [position() = 1]' – Andersson

+0

@Andersson: Это не отличается от '// B/C [1]'. – kjhughes

+0

@kjhughes, и оба должны работать :) – Andersson

ответ

1

XPath, что вы говорите, что вы уже пробовали,

//B/C[1] 

это именно то, что вы хотите, чтобы выбрать все первые C элементы B элементов:

<C>want this</C> 
<C>want this, too</C> 

без каких-либо других элементов C ,

Если вы не видите оба элемента C, как показано выше, тогда что-то фильтрует только первый результат, прежде чем вы его увидите. Возможно, вы переходите к другой функции, которая автоматически берет первый узел узла.

+0

Hm. Спасибо, что подтвердил мое подозрение. Если вы знакомы с Appium, знаете ли вы, почему это не работает? – econoMichael

+0

Я никогда не использовал Appium, но буду следить за любыми промежуточными функциями между '// B/C [1]' и вашими результатами, которые могут возвращать только первый узел узла. Например, в XPath 1.0, 'string (// B/C [1])' возвращает только '", хочу, чтобы этот '', а не '' хотел thiswant это тоже ". – kjhughes

+0

Спасибо за подсказку. Я проверю это. – econoMichael