【问题标题】:Can't get PHP DOMXpath substring functions to work无法使 PHP DOMXpath 子字符串函数工作
【发布时间】:2015-12-03 23:06:50
【问题描述】:

使用以下 PHP 代码示例:

$xml = "<person><name>John-Doe</name></person>";
$doc = new DOMDocument("1.0", "ISO-8859-15");
$xpath = new DOMXpath($doc);
$nodelist = $xpath->query("substring-before(/person/name/text(), '-Doe')");
print "Found " . $nodelist->length . " results.";

我得到了输出:

找到 0 个结果

但是当我将相同的 XML 和 xpath 查询放入在线 Xpath 测试仪时,我得到了预期的结果,即“John”

我似乎也无法使用 substring() 和 substring-after() 获得任何结果。是 PHP 的 DOMXpath 出了问题,还是我做错了什么?

【问题讨论】:

  • PHP 的 DOMXPath 说它是 "Supports XPath 1.0",但 substring-before 是在 1.0.4.2 中添加的,因此它可能不受支持。无论如何,一旦您检索到person/name 文本,PHP 就可以轻松完成这种事情;为什么要费心尝试在 XPath 中做呢?

标签: php xpath


【解决方案1】:

XPath substring-before() 函数返回 string 而不是节点,您不应该使用 DOMXPath::query() 来执行不返回节点*的 XPath 表达式。 DOMXPath::evaluate() 是这里要使用的正确函数:

$xml = "<person><name>John-Doe</name></person>";
$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXpath($doc);
$result = $xpath->evaluate("substring-before(/person/name/text(), '-Doe')");
print $result;

eval.in demo

输出:

John

*) 引用自DOMXPath::query > Return Values

任何不返回节点的表达式都将返回一个空的DOMNodeList

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2019-05-27
    • 2014-11-14
    • 2014-11-16
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多