我将以下XML文件加载到一个phpsimplexml变量中,我需要从其中一个子bin中查找status和unit_id。我已经知道它将在哪个shelve[]
子项下,只是不知道bin子项。
<frames>
<shelve>
<bins>
<bin>
<bin_id>3</bin_id>
<status>OPEN</status>
</bin>
<bin>
<bin_id>2</bin_id>
<status>OPEN</status>
</bin>
</bins>
</shelve>
<shelve>
<bins>
<bin>
<units>
<unit>
<unit_id>123456789</id>
</unit>
</units>
<bin_id>1</bin_id>
<status>TAKEN</status>
</bin>
<bin>
<bin_id>2</bin_id>
<status>OPEN</status>
</bin>
</bins>
</shelve>
</frames>
例如,我需要获得状态和CCD_ 2,其中CCD_。那么,我该如何找到通往正确bin[]
的路径呢?
frames->shelve[1]->bins->bin[0]->status
frames->shelve[1]->bins->bin[0]->units->unit->unit_id
使用Xpath从XML查询数据。SimpleXml通过其xpath()方法支持它,但并不完全支持。DOMXpath::evaluate()更强大:
$xml = <<<'XML'
<frames>
<shelve>
<bins>
<bin><bin_id>3</bin_id><status>OPEN</status></bin>
<bin><bin_id>2</bin_id><status>OPEN</status></bin>
</bins>
</shelve>
<shelve>
<bins>
<bin>
<units><unit><unit_id>123456789</unit_id></unit></units>
<bin_id>1</bin_id>
<status>TAKEN</status>
</bin>
<bin><bin_id>2</bin_id><status>OPEN</status></bin>
</bins>
</shelve>
</frames>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
if ($xpath->evaluate('count(//bin[bin_id = 1])') > 0) {
$binNode = $xpath->evaluate('//bin[bin_id = 1]')->item(0);
$unitId = $xpath->evaluate('string(./units/unit/unit_id)', $binNode);
$status = $xpath->evaluate('string(./status)', $binNode);
var_dump(
$unitId, $status
);
}
输出:
string(9) "123456789"
string(5) "TAKEN"