如何通过 php 基于另一个节点值 select 节点值?

how to select nodevalue based on another nodevalue via php ?

我有一个 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>

现在我想获取中间的节点值,其中节点值大小为 5,我尝试了以下代码但没有结果:

$doc = new DOMDocument();
$doc->load($file);

$xpath = new DOMXPath($doc);

$query = '//Response/return/size[.="5"]/mid';

$entries = $xpath->evaluate($query);

那我该怎么做呢?

提前致谢

您也可以在这种情况下使用 following::sibling。获取 mid 值,其中其后续兄弟的大小与文本等于 5。粗略示例:

$query = 'string(//ns1:Response/ns1:return/ns1:mid[following-sibling::ns1:size[text()="5"]])';

Sample Output

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

试试这个:

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

然后,查看结果:

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

PHP 对当前上下文的名称空间有一些自动注册,但最好不要依赖它。前缀可以改变。您甚至可以使用默认命名空间并避免使用前缀。

最好注册自己的前缀:

$xpath->registerNamespace('e', 'http://example.com/');

在 XPath 中,您使用以下条件定义位置路径:

Response 节点内的任何 return 节点:

//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"