如何通过 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"]])';
您缺少一些命名空间,并且您正在尝试获取内容为 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"
我有一个 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"]])';
您缺少一些命名空间,并且您正在尝试获取内容为 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"