цикл в пространстве имен XML - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть XML:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns2:ReadPNRResponseBody xmlns="http://trippro.com/webservices/common/v2" xmlns:ns2="http://trippro.com/webservices/readpnr/v2">
            <ns2:ReadPNRResponse>
                <ns2:PaxDetail>
                    <PaxRef>1</PaxRef>
                    <PaxType>ADT</PaxType>
                    <FirstName>JOHN</FirstName>
                    <MiddleName>ADAM</MiddleName>
                    <LastName>DOE</LastName>
                    <Gender>M</Gender>
                    <DateOfBirth>08/15/1983</DateOfBirth>
                    <PassportNumber>9DUSIJH232</PassportNumber>
                    <Nationality>IN</Nationality>
                    <CountryOfIssue>US</CountryOfIssue>
                </ns2:PaxDetail>
                <ns2:PaxDetail>
                    <PaxRef>1</PaxRef>
                    <PaxType>ADT</PaxType>
                    <FirstName>JEAN</FirstName>
                    <MiddleName></MiddleName>
                    <LastName>SMITH</LastName>
                    <Gender>M</Gender>
                    <DateOfBirth>08/15/1983</DateOfBirth>
                    <PassportNumber>9DUSIJH232</PassportNumber>
                    <Nationality>CA</Nationality>
                    <CountryOfIssue>CA</CountryOfIssue>
                </ns2:PaxDetail>
            </ns2:ReadPNRResponse>
        </ns2:ReadPNRResponseBody>
    </soap:Body>
</soap:Envelope>

Я хочу l oop для элементов PaxDetail. Я попробовал это, но похоже, что он берет только первый элемент. Как я могу l oop на PaxDetail

$response = $simpleXmlElement->children('soap', true)->Body->children('ns2', true);

foreach($response->ReadPNRResponseBody->ReadPNRResponse->PaxDetail->children() as $PaxDetail){

};

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы ссылаетесь на самый низкий уровень данных (<PaxRef> et c) в foreach(), это должно быть сделано внутри l oop, чтобы l oop просто зацикливался на <ns2:PaxDetail> элементы ...

foreach($response->ReadPNRResponseBody->ReadPNRResponse->PaxDetail as $PaxDetail){
    echo $PaxDetail->children()->FirstName.PHP_EOL;
};
0 голосов
/ 16 апреля 2020

Вам нужно go опуститься до родительского уровня PaxDetail (он же ns2: ReadPNRResponse), а затем начать цикл по дочерним элементам:

$response = $simpleXmlElement->children('soap', true)->Body->children('ns2', true)->ReadPNRResponseBody->ReadPNRResponse;

foreach($response->children('ns2', true) as $PaxDetail){
    foreach($PaxDetail->children() as $item) {
        var_dump($item); //will show all items
    }
}
...