1

これは、私が読んでいる XML ファイルの一部です。

<hotel>    
<Location>
    <Identifier>D5023</Identifier>
    <IsAvailable>true</IsAvailable>
    <Availability>
        <TimeStamp>2015-06-11T16:04:23.887</TimeStamp>
        <Rooms>525</Rooms>
        <Beds>845</Beds>
    </Availability>
</Location>
<Location>
    ect.
</Location>
</hotel>

XMLsimple を使用して、場所 D5023 (およびその他の場所) で利用可能な部屋の数を取得したいと考えています。しかし、Identifier は Location 属性の子であるため、適切なデータを取得するのに苦労しています。

これは私が思いついたものですが、明らかにこれは機能しません

$hotel->Location->Identifier['D5023']->Availability->Rooms;

どうすればこれを正しく行うことができますか?

4

3 に答える 3

1

XML の特定の部分を複雑な条件で取得するために使用できますSimpleXMLElement::xpath()。たとえば、次のようになります。

$xml = <<<XML
<hotel>    
<Location>
    <Identifier>D5023</Identifier>
    <IsAvailable>true</IsAvailable>
    <Availability>
        <TimeStamp>2015-06-11T16:04:23.887</TimeStamp>
        <Rooms>525</Rooms>
        <Beds>845</Beds>
    </Availability>
</Location>
<Location>
    ect.
</Location>
</hotel>
XML;
$hotel = new SimpleXMLElement($xml);
$result = $hotel->xpath("/hotel/Location[Identifier='D5023']/Availability/Rooms")[0];
echo $result;

出力:

525

Demo

于 2015-06-12T04:25:16.013 に答える
0

ファイルをロードし、XML ファイルをループして ID を確認します。xml をオブジェクトから文字列にキャストすることを忘れないでください。これにより、オブジェクトと文字列ではなく、2 つの文字列を相互に比較できます。

if( $xml = simplexml_load_file("path_to_xml.xml",'SimpleXMLElement', LIBXML_NOWARNING) ) 
        {
            echo("File loaded ...");

            // loop through XML 
            foreach ($xml->hotel as $hotel)
            { 
                // convert the xml object to a string and compare it with the room ID
                if((string)$hotel->Location->Identifier == "D5023")
                {
                    echo("there are ".$hotel->Location->Availability->Rooms."Available room in this hotel");
                }
            }
        }
        else
        echo("error loading file!");

それが役立つことを願っています!

于 2015-06-11T18:46:47.087 に答える
0

より多くの場所があるため、ループしすぎます:

foreach ($hotel->Location as $l) {
    if ("D5023" === $l->Identifier) {
        var_dump($l->Availability->Rooms);
    }
}
于 2015-06-11T18:21:15.813 に答える