Использование регулярных выражений для получения узла Nokogiri - PullRequest
0 голосов
/ 30 марта 2020

Я анализирую файл XML с помощью Nokogiri.

В настоящее время я использую следующее для получения необходимого значения (документ содержит несколько Phase узлов):

xml.xpath("//Phase[@text=' = STER P=P(T)         ']")

Но теперь загруженный файл XML может иметь атрибут text с другим значением. Таким образом, я пытаюсь обновить свой код с помощью регулярного выражения, так как значение всегда содержит STER.

После просмотра нескольких вопросов по SO, я попытался

xml.xpath("//Phase[@text~=/STER/]")

Однако , когда я запускаю его, я получаю

ERROR: Invalid predicate: //Phase[@text~=/STER/] (Nokogiri::XML::XPath::SyntaxError)

Что мне здесь не хватает?

В качестве альтернативы, есть ли функция XPATH, похожая на начальный-с`, которая ищет подстроку во всем значение, а не только в его начале?

1 Ответ

3 голосов
/ 30 марта 2020

С вашим кодом есть две проблемы: во-первых, в XPath нет оператора =~. Чтобы проверить, соответствует ли текст регулярному выражению, используется функция matches :

//Phase[matches(@text, 'STER')]

Во-вторых, сопоставление регулярному выражению является функцией XPath 2.0 , но Nokogiri реализует XPath 1.0 .

К счастью, вы фактически не используете какие-либо функции регулярных выражений, вы просто проверяете фиксированную строку, что можно сделать с помощью XPath 1.0 с помощью contains функция :

//Phase[contains(@text, 'STER')]
...