Оператор XPath АБО для різних вузлів


144

Як мені робити XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

Просто //titleне буде працювати, тому що я також маю//bookstore/magazine/title

ps Я бачив багато або прикладів, але в основному з атрибутами або однією структурою вузла.


5
АБО включено з обох сторін. Що ви шукаєте, це оператор XOR. Ви пов'язуєте вживання англійською мовою слова АБО з логічними операторами.
Зоран Павлович

10
В даному випадку це не має значення , чи використовується ви або чи виключає , як це не можливо , щоб відповідати обом сторонам.
Dan Hulme

Відповіді:


219

Усі titleвузли з батьківським zipcodeабо bookвузлом:

Версія 1:

//title[parent::zipcode|parent::book]

Версія 2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
"|" насправді не є оператором "АБО" в XPath. Це дозволяє вам створити набір вузлів, складений з підреєстрів цілого дерева XML. "// книга | // cd" означає, що серед усіх дочірніх вузлів і нащадків кореневого вузла знайдіть усі, з назвою "книга", а також знайдіть також усі з назвою "cd". Якщо у спаді кореневого вузла є лише вузли книги, ваш набір вузлів буде містити лише вузли книги. Якщо у спаді кореневого вузла є лише cd-вузли, ваш набір вузлів буде містити лише cd-вузли. Якщо у спаді кореневого вузла є і вузли book, і cd, ваш набір вузлів буде містити як book, так і cd.
Стефан

1
Так, я зрозумів, що "|" оператор є. Моє первинне запитання щодо оператора АБО. Отже, якщо є книги & CD, вони знайдуть лише книги, якщо немає книг, а лише CD, вони знайдуть CD.
користувач569008


1
Отже, на моє запитання немає відповіді / немає оператора АБО у XPath для вузлів?
user569008

3
Логічні оператори (АБО, XOR і AND) однакові у всіх мовах програмування, але природна мова інтерпретує їх дещо по-різному. Найкраще прибрати неоднозначність при обговоренні пов'язаних з ними питань. Крім того, з допомогою XPath, краще не думати про свій результат , як бути а чи б , а то , що він може бути розташований на а чи б . Логічні orзасоби, за якими він міг би знаходитись a or b or both. Логічний xor(eXclusive АБО) означає, що він міг би знаходитись either a or b, but not both. Логічні andзасоби, за якими він міг би знаходитись both a and b.
neXus

52

Якщо ви хочете вибрати лише один з двох вузлів з оператором об'єднання, ви можете скористатися цим рішенням: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


дійсно (та )[1]означає вибрати лише одне з двох?!?!
oldboy

@Anthony Так, він вибере один з двох, якщо обидва вузли існують, або він вибере єдиний, який існує.
азуркін

добре, я неправильно трактував вашу заяву. він працює як і будь-який інший оператор "або", так що якщо перша умова повертається як істинна, то друга обходить, так?
oldboy

@Anthony No. Тут немає жодних умов. Є вузли. І "|" - це оператор об'єднання вузлів. Він створює набір вузлів із заданих шляхів і не гарантує порядок вузлів. Якщо вузол із заданим шляхом не існує, він просто відсутній у наборі вузла. Потім "[1]" конструкція отримує перший вузол з набору вузлів.
азуркін

моя думка полягає в тому, що він функціонує аналогічно оператору orабо в інших мовах |, так що якщо б існували обидва вузли, він завжди повертав би перший вузол?
oldboy

3

У цього елемента є два xpath. Тоді ви можете написати два xpaths, як показано нижче:

xpath1 | xpath2

Наприклад:

//input[@name="username"] | //input[@id="wm_login-username"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.