我有以下XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root (entry*)>
<!ELEMENT entry (#PCDATA)>
<!ENTITY abc "a b c">
<!ENTITY xyz "x y z">
]>
<root>
<entry>&abc;</entry>
<entry>&xyz;</entry>
<entry>text</entry>
</root>
我使用以下命令在其上测试我的 XPaths:
xmllint --xpath '...' test.xml
我正在尝试将一些自定义实体与如下所示的 XPath 匹配:
//entry[text() = '&abc;']
但它与任何东西都不匹配。所以我什至尝试了:
//entry/text()
唯一的结果是最后一个条目text
,前两个条目没有任何结果。如果text()
不返回自定义实体,还有其他方法吗?有没有办法只匹配包含&abc;
的条目?
顺从行为
不能针对&abc;
内部常规实体引用进行测试,因为当内部常规实体引用出现在 XML 文档的内容中时,XML 解析器必须将内部常规实体引用替换为其替换文本 (a b c
(。
您可以通过将 XPath 从
//entry[text() = '&abc;']
它不选择任何内容
//entry[text() = 'a b c']
选择包含替换文本的entry
元素。
替换文本应可用作文本节点,因此
//entry/text()
选择三个文本节点:
a b c
x y z
text
Xmllint 的行为
要从xmllint
获取此预期行为,请使用(名称奇怪的(--noent
标志。