如何编写包含 HTML 实体的 XPath 查询?



我有这个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>

在我尝试使用 Python 和 XPath 解析的 XML 文件中。下面是应与脚本标记匹配的行:

getLines = xml.xpath('//*[local-name()="scriptTask"][@name="%s"]/*[local-name()="script"]/text()' % script_name)script_name应该在 XML 文件中的所有现有 scriptTask 标记的其中一个迭代中set variables app_from_user &amp; applist to &quot;ticketingsystem&quot;的位置。

它适用于所有其他标签,但不适用于这个标签。当我删除 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标记内的内容而不会出错?

你的引号有问题。在XPath中,引号必须在"'之间分别&quot;&apos;之间交替改变。由于在%s参数中使用&quot;,因此周围的括号必须'或分别&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;实体应正确封装在[@name='%s']&apos;实体中。

W3Resource 上有一个关于 XML 中实体的参考,它说:

属性值中使用撇号 ('( 和引号字符 ("( 时,可能还需要编码为实体。如果属性值的分隔符是撇号,则引号字符是合法的,但撇号字符不是合法的,因为它将表示属性值的结束。如果需要撇号,则必须使用字符实体&apos;。同样,如果在由引号分隔的属性值中需要引号字符,则必须使用字符实体&quot;

最新更新