PHP simplexml search


PHP simplexml search

我将以下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"