如何通过php选择基于另一个nodevalue的nodevalue?

时间:2015-01-16 07:44:30

标签: php xml xpath simplexml

我有一个包含以下内容的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);

那我怎么能这样做呢?

提前致谢

3 个答案:

答案 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"]])';

Sample Output

答案 2 :(得分:0)

您缺少一些命名空间,并且您正在尝试获取内容为5的 size 元素的子 mid

试试这个:

$query = '//ns1:Response/ns1:return/ns1:mid[../ns1:size[text()="5"]]';

然后,看到结果:

foreach ($entries as $entry) {
    echo $entry->nodeValue . "<br />";
}