You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用XPath选择带命名空间的xt:vars节点问题

解决PHP中XPath选择带命名空间的xt:vars节点问题

你的代码存在几个关键问题,导致无法正确选中目标节点,以下是具体修正方案:

1. 修正命名空间URL不匹配问题

XML文档里声明的命名空间是 http://www.example.net/xt,但你代码里注册的是 http://www.xelos.net/xt,两者必须完全一致,否则XPath无法识别命名空间下的节点。

2. 用loadXML替代loadHTML加载文档

你当前用loadHTML处理XML,这会让DOMDocument把XML当成HTML解析,破坏原有的节点结构,必须改用loadXML来加载XML内容。

3. 编写正确的XPath查询语句

XPath查询时必须使用注册的命名空间前缀,针对你的需求,正确的查询语句应该是:

$query = "//xt:locale/xt:vars[@language='{$language}']";

如果要更精确匹配根节点的子元素,可以写成:

$query = "/xt:locale/xt:vars[@language='{$language}']";

修正后的完整代码

$template_content = file_get_contents($template_file);
$xml = new \DOMDocument("1.0", "UTF-8");
$xml->preserveWhiteSpace = false;
// 禁用XML错误提示(可选,根据需求调整)
libxml_use_internal_errors(true);
if ($xml->loadXML($template_content)) {
    $xpath = new \DOMXPath($xml);
    // 注册正确的命名空间
    $xpath->registerNamespace('xt', 'http://www.example.net/xt');
    $query = "//xt:locale/xt:vars[@language='{$language}']";
    $entries = $xpath->query($query);
    $xmlContent = '';
    foreach($entries as $entry) {
        $xmlContent = $entry->ownerDocument->saveXML($entry);
    }
    if ($xmlContent) {
        $template_content = $xmlContent;
        dump($template_content);
    }
}
// 清除XML错误(如果启用了libxml_use_internal_errors)
libxml_clear_errors();

内容的提问来源于stack exchange,提问作者Wieczo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:48:17