python - 如何编写包含 HTML 实体的 XPath 查询?
问题描述
我有这个 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)
wherescript_name
应该set variables app_from_user & applist to "ticketingsystem"
在 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
无错误地提取标签内的内容?
解决方案
你的报价有问题。在 XPath 中,引号必须分别在"
和和之间交替变化。因为您在参数中使用,所以周围的括号必须分别是 或。所以你的 XPath 表达式可能看起来像这样......'
"
'
"
%s
'
'
//*[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 中实体的参考,其中说:
撇号 (') 和引号字符 (") 在用于属性值时也可能需要编码为实体。如果属性值的分隔符是撇号,则引号字符是合法的,但撇号字符不合法,因为它将表示属性值的结束。如果需要撇号,则
'
必须使用字符实体。类似地,如果在由引号分隔的属性值中需要引号字符,则"
必须使用字符实体。
推荐阅读
- android - 扩展广播的事务缓冲区限制
- python - 两个 rank-1 张量流张量上的运算符
- sorting - 有没有办法对这种排序算法进行简单的更改,使其运行速度比二次时间快?
- python - Python - 如何在另一个有范围的循环中运行一个循环?
- c++ - 在 C++ 中使用并行化的预期加速是多少(不是 OpenMp,而是
) - html - 如何在 HTML 中正确显示此代码段?
- php - 如何在 laravel 中使用数据透视表中的 3 个关系创建关系?
- javascript - 从 glMatrix 1 迁移到 glMatrix 2
- java - 如何初始化“if then”语句给出的变量?
- r - Installing tidyverse on Ubuntu 18.x & R 3.4.4/3.5.1