首页 > 解决方案 > 如何编写包含 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)wherescript_name应该set variables app_from_user &amp; applist to &quot;ticketingsystem&quot;在 XML 文件中所有现有 scriptTask 标记的迭代之一中。

它适用于所有其他标签,但不适用于这个标签。当我删除 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无错误地提取标签内的内容?

标签: pythonxmlxpathxml-parsinglxml

解决方案


你的报价有问题。在 XPath 中,引号必须分别在"和和之间交替变化。因为您在参数中使用,所以周围的括号必须分别是 或。所以你的 XPath 表达式可能看起来像这样......'&quot;&apos;&quot;%s'&apos;

//*[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 中实体的参考,其中说:

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


推荐阅读