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
相关产品推荐
相关产品推荐

