我有这个XML块:
<bpmn:scriptTask id="UserTask_0qtrxsq" name="set variables app_from_user & applist to "ticketingsystem"" 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 & applist to "ticketingsystem"
的位置。
它适用于所有其他标签,但不适用于这个标签。当我删除 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中,引号必须在"
和'
之间分别"
和'
之间交替改变。由于在%s
参数中使用"
,因此周围的括号必须'
或分别'
。所以你的 XPath 表达式可能看起来像这样...
//*[local-name()='scriptTask'][@name='set variables app_from_user & applist to "ticketingsystem"']/*[local-name()='script']/text()
因此,您的整个表达式可能如下所示:
getLines = xml.xpath("//*[local-name()='scriptTask'][@name='%s']/*[local-name()='script']/text()" % script_name)
现在,"
实体应正确封装在[@name='%s']
的'
实体中。
W3Resource 上有一个关于 XML 中实体的参考,它说:
在属性值中使用撇号 ('( 和引号字符 ("( 时,可能还需要编码为实体。如果属性值的分隔符是撇号,则引号字符是合法的,但撇号字符不是合法的,因为它将表示属性值的结束。如果需要撇号,则必须使用字符实体
'
。同样,如果在由引号分隔的属性值中需要引号字符,则必须使用字符实体"
。