Как написать запрос XPath, содержащий HTML-сущности? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть этот блок XML:

<bpmn:scriptTask id="UserTask_0qtrxsq" name="set variables app_from_user &amp; applist to &quot;ticketingsystem&quot;" scriptFormat="groovy">
... <bpmn:script> What should be matched is here ... </bpmn:script>
</bpmn:scriptTask>

в файле XML, который я пытаюсь проанализировать с помощью Python и XPath.Ниже приведена строка, которая должна соответствовать тегу script:

getLines = xml.xpath('//*[local-name()="scriptTask"][@name="%s"]/*[local-name()="script"]/text()' % script_name), где script_name должно быть set variables app_from_user &amp; applist to &quot;ticketingsystem&quot; в одной из итераций по всем существующим тегам scriptTask в файле XML.

Он отлично работает для всех других тегов, но не для этого.Когда я удалил сущности HTML (местозаполнители для амперсандов, кавычек и т. Д., Он работал нормально:

<bpmn:scriptTask id="UserTask_0qtrxsq" name="set variables app_from_user" scriptFormat="groovy">
... <bpmn:script> What should be matched is here ... </bpmn:script>
</bpmn:scriptTask>

Но я не имею контроля над файлами XML, и я хочу, чтобы скрипт был таким же общим, какМожно ли сделать запрос XPath для извлечения содержимого тега script без ошибок?

1 Ответ

0 голосов
/ 24 сентября 2019

У вас проблема с вашими цитатами.В XPath кавычки должны изменяться между " и ', соответственно &quot; и &apos;, поочередно.Поскольку вы используете &quot; в параметре %s, окружающие скобки должны быть ' или, соответственно, &apos;.Таким образом, ваше выражение XPath может выглядеть следующим образом ...

//*[local-name()='scriptTask'][@name='set variables app_from_user &amp; applist to &quot;ticketingsystem&quot;']/*[local-name()='script']/text()

и, следовательно, все ваше выражение может выглядеть следующим образом:

getLines = xml.xpath("//*[local-name()='scriptTask'][@name='%s']/*[local-name()='script']/text()" % script_name)

Теперь сущности &quot; должны быть правильно инкапсулированыв &apos; сущностях [@name='%s'].

В W3Resource есть ссылка на сущностей в XML, в которой говорится:

Апостроф (') и символы кавычек ("), возможно, также должны быть закодированы как сущности при использовании в значениях атрибутов. Если разделителем для значения атрибута является апостроф, то символ кавычки является допустимым, а символ апостроф - нет, поскольку он будет сигнализироватьконец значения атрибута. Если необходим апостроф, необходимо использовать символьную сущность ". Аналогичным образом, если требуется символ кавычки в значении атрибута, который ограничен кавычками, то должна использоваться символьная сущность".

Надеюсь, это поможет.

...