Лучший способ выбора нескольких элементов по имени атрибута в XPath - PullRequest
4 голосов
/ 26 августа 2010

Я ищу, чтобы выбрать коллекцию элементов на основе массива имен ID.В настоящее время я, по сути, использую гигантский оператор OR:

//*[@id='apple']|//*[@id='orange']|//*[@id='banana']

Но создание этой строки вручную кажется грязным.Есть ли что-то вроде красивого оператора SQL-esque "WHERE IN [a,b,c]", который я мог бы использовать?

Я использую HTTPAgilityPack для ASP.Net, который, я думаю, приравнивается к XPath1.o (не стесняйтесь поправлять меня в этом.)

Спасибо.

Ответы [ 2 ]

5 голосов
/ 26 августа 2010

Во-первых, вы можете упростить это, используя or. Это позволяет избежать повторения //* несколько раз, хотя вы можете указать @id= часть несколько раз:

//*[@id='apple' or @id='orange' or @id='banana']

Более элегантное решение - проверить список допустимых идентификаторов. Теперь, если вы используете XPath 1.x, вам нужно будет немного поработать с гимнастикой, чтобы получить contains () для выполнения ставок. В частности, обратите внимание, что у меня есть пробелы на обоих концах первой строки, а затем объедините пробелы с каждым концом @id перед поиском совпадения. Это необходимо для предотвращения совпадения @id из "range", например.

//*[contains(' apple orange banana ', concat(' ', @id, ' '))]

Если вы используете XPath 2.0, то путь вперед упрощается благодаря добавлению последовательностей в язык:

//*[exists(index-of(('apple', 'orange', 'banana'), @id))]
3 голосов
/ 26 августа 2010

Использование :

//*[contains('|apple|banana|orange|', concat('|',@id, '|'))]

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

Решение XPath 2.0 :

// * [@ id = ('apple', 'orange', 'банан ')]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...