PHP - Node DOM错误:"调用成员函数getAttribute()为null"


PHP - Node DOM error: "Call to a member function getAttribute() on null"

我有一个来自Web服务器响应的数据(soap XML)问题。这是服务器的响应:

<xsd:hotel xsd:id="50280829" xsd:name="Villa D'Amato" xsd:lastUpdated="2016-07-28T20:33:00.786+03:00">
        <xsd:room xsd:seqNo="0" xsd:id="2445883190" xsd:specialOffer="false" xsd:price="127.14" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="2359298" xsd1:name="Breakfast" xsd1:nameEn="Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="54308004" xsd:hotelstonName="Superior Room Double Or Twin - Double Bed" xsd1:name="Superior Double or Twin Room (1 Double Bed)" xsd1:nameEn="Superior Double or Twin Room (1 Double Bed)" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:specifficSpecialOffer xsd1:type="PACKAGE_RATE" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883190" xsd:specialOffer="false" xsd:price="127.14" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="2359298" xsd1:name="Breakfast" xsd1:nameEn="Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="54308001" xsd:hotelstonName="Superior Room Double Or Twin" xsd1:name="Superior Double or Twin Room (2 Twin Beds)" xsd1:nameEn="Superior Double or Twin Room (2 Twin Beds)" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:specifficSpecialOffer xsd1:type="PACKAGE_RATE" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883057" xsd:specialOffer="false" xsd:price="129.76" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="30769205" xsd1:name="English Breakfast" xsd1:nameEn="English Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="52656547" xsd:hotelstonName="Superior Room Double Or Twin" xsd1:name="Superior Double or Twin Room" xsd1:nameEn="Superior Double or Twin Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883059" xsd:specialOffer="false" xsd:price="132.00" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309844" xsd:groupName="Room Only" xsd1:id="2359299" xsd1:name="Room Only" xsd1:nameEn="Room Only" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="53337950" xsd:hotelstonName="Superior Room Double Or Twin - Double Bed" xsd1:name="Superior Double or Twin Room - 1 double bed" xsd1:nameEn="Superior Double or Twin Room - 1 double bed" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883192" xsd:specialOffer="false" xsd:price="137.74" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="2359298" xsd1:name="Breakfast" xsd1:nameEn="Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="54308002" xsd:hotelstonName="Deluxe Room Double Or Twin - Double Bed" xsd1:name="Deluxe Double or Twin Room (1 Double Bed)" xsd1:nameEn="Deluxe Double or Twin Room (1 Double Bed)" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:specifficSpecialOffer xsd1:type="PACKAGE_RATE" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883192" xsd:specialOffer="false" xsd:price="137.74" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="2359298" xsd1:name="Breakfast" xsd1:nameEn="Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="54308003" xsd:hotelstonName="Deluxe Room Double Or Twin" xsd1:name="Deluxe Double or Twin Room (2 Twin Beds)" xsd1:nameEn="Deluxe Double or Twin Room (2 Twin Beds)" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:specifficSpecialOffer xsd1:type="PACKAGE_RATE" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883060" xsd:specialOffer="false" xsd:price="140.58" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="30769205" xsd1:name="English Breakfast" xsd1:nameEn="English Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="55809087" xsd:hotelstonName="Deluxe Room Double Or Twin" xsd1:name="Deluxe Double or Twin Room" xsd1:nameEn="Deluxe Double or Twin Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883061" xsd:specialOffer="false" xsd:price="142.80" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309844" xsd:groupName="Room Only" xsd1:id="2359299" xsd1:name="Room Only" xsd1:nameEn="Room Only" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="53338038" xsd:hotelstonName="Deluxe Room Double Or Twin - Double Bed" xsd1:name="Deluxe Double or Twin Room - 1 double bed" xsd1:nameEn="Deluxe Double or Twin Room - 1 double bed" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883948" xsd:specialOffer="false" xsd:price="145.20" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="30769205" xsd1:name="English Breakfast" xsd1:nameEn="English Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="52625987" xsd:hotelstonName="Room Double" xsd1:name="Double Room" xsd1:nameEn="Double Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883949" xsd:specialOffer="false" xsd:price="145.20" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="30769205" xsd1:name="English Breakfast" xsd1:nameEn="English Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="52625978" xsd:hotelstonName="Room Twin" xsd1:name="Twin Room" xsd1:nameEn="Twin Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883474" xsd:specialOffer="false" xsd:price="175.22" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309841" xsd:groupName="Breakfast" xsd1:id="2359298" xsd1:name="Breakfast" xsd1:nameEn="Breakfast" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="56172839" xsd:hotelstonName="Standard Double Or Twin" xsd1:name="Double or twin standard" xsd1:nameEn="Double or twin standard" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445882979" xsd:specialOffer="false" xsd:price="233.07" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309843" xsd:groupName="Half Board" xsd1:id="50000721" xsd1:name="Cold Buffet Half Board" xsd1:nameEn="Cold Buffet Half Board" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="50281796" xsd:hotelstonName="Standard Room" xsd1:name="Standard Room" xsd1:nameEn="Standard Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
        <xsd:room xsd:seqNo="0" xsd:id="2445883063" xsd:specialOffer="false" xsd:price="309.60" xsd:visaSupport="false">
           <xsd:boardType xsd:groupId="30309842" xsd:groupName="Full Board" xsd1:id="3244032" xsd1:name="Full Board" xsd1:nameEn="Full Board" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
           <xsd:roomType xsd1:id="52679712" xsd:hotelstonName="Standard Room" xsd1:name="Standard Room" xsd1:nameEn="Standard Room" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>
        </xsd:room>
     </xsd:hotel>

当我试图导出标签的值时,问题发生了:

<xsd:specifficSpecialOffer xsd1:type="PACKAGE_RATE" xmlns:xsd1="http://types.ws.hotelston.com/xsd"/>

事实上,如果你注释这行代码,一切都很好。我尝试隔离完全放弃行,只在节点以这种方式存在时才尝试取值:

if($specialOffer==null) {
$tipo_offerta="";
} else {
$tipo_offerta= $specialOffer[0]->getAttribute('xsd1:type');
}

但不幸的是它仍然不工作!我理解这个问题的发生是因为这个标签不存在于房间的所有节点上。有人能解释一下原因吗?我该如何解决这个问题?

$specialOffer

是响应

的节点

感谢大家

解决方案:

if($specialOffer==NULL){
$tipo_offerta="";
} else {
$tipo_offerta= $specialOffer[0]->getAttribute('xsd1:type');
}

当检查节点是否存在时,我忘记给数组添加索引

specialOffer美元[0]

我使用0,我没有使用计数器,因为它是唯一的节点。