我有一个包含以下内容的xml文件:
<ns1:Response xmlns:ns1="http://example.com/">
- <ns1:return>
<ns1:mid>39824</ns1:mid>
<ns1:serverType>4</ns1:serverType>
<ns1:size>5</ns1:size>
</ns1:return>
- <ns1:return>....
</ns1:return>
现在我想获得nodevalue of nodevalue size为5的中间值,我尝试了以下代码,但没有结果:
$doc = new DOMDocument();
$doc->load($file);
$xpath = new DOMXPath($doc);
$query = '//Response/return/size[.="5"]/mid';
$entries = $xpath->evaluate($query);
那我怎么能这样做呢?
提前致谢
答案 0 :(得分:1)
PHP对当前上下文的命名空间进行了一些自动注册,但最好不要依赖它。前缀可以更改。您甚至可以使用默认命名空间并避免使用前缀。
最好注册你自己的前缀:
$xpath->registerNamespace('e', 'http://example.com/');
在XPath中,您可以使用条件定义位置路径:
return
节点内的任何Response
节点:
//e:Response/e:return
如果它具有值为size
5
节点
//e:Response/e:return[e:size = 5]
获取其中的mid
节点
//e:Response/e:return[e:size = 5]/e:mid
将第一个找到的mid
节点转换为字符串
string(//e:Response/e:return[e:size = 5]/e:mid)
完整示例:
$xml = <<<'XML'
<ns1:Response xmlns:ns1="http://example.com/">
<ns1:return>
<ns1:mid>39824</ns1:mid>
<ns1:serverType>4</ns1:serverType>
<ns1:size>5</ns1:size>
</ns1:return>
<ns1:return></ns1:return>
</ns1:Response>
XML;
$doc = new DOMDocument();
$doc->loadXml($xml);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('e', 'http://example.com/');
$mid = $xpath->evaluate(
'string(//e:Response/e:return[e:size = 5]/e:mid)'
);
var_dump($mid);
输出:
string(5) "39824"
答案 1 :(得分:0)
在这种情况下,您也可以使用following::sibling
。获取mid
值,其后面的兄弟是大小,文本等于5.粗略示例:
$query = 'string(//ns1:Response/ns1:return/ns1:mid[following-sibling::ns1:size[text()="5"]])';
答案 2 :(得分:0)
您缺少一些命名空间,并且您正在尝试获取内容为5的 size 元素的子 mid 。
试试这个:
$query = '//ns1:Response/ns1:return/ns1:mid[../ns1:size[text()="5"]]';
然后,看到结果:
foreach ($entries as $entry) {
echo $entry->nodeValue . "<br />";
}