我有一个丑陋的XML,上面有很多名称空间,当我尝试使用simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会将其添加到该对象.
这是SOAP响应
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns8502="http://tempuri.org">
<SOAP-ENV:Header>
<Interface PartnerID="FastBooking" PartnerType="Test" Version="1.0.0" />
<Credentials HotelID="AC00006" User="User" Password="123456" />
<Client Ref ="123456789" TimeStamp="2012-12-14T12:24:25+0100"/>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ServiceNameRQ xmlns="urn:wsTest">
<GetRatesRS>
<Rates>
<Rate RateID="12984" FromDate="2010-05-12" ToDate="2010-06-30" RateType="PUBLIC" RateCode="RAC" MinRate="100" MaxRate="1000" Currency="EUR" ReadOnly="No" FromrateID="11456">
<RateName>Rack Rate</RateName>
</Rate>
<Rate RateID="13219" FromDate="2010-07-12" ToDate="2010-12-31" RateType="PUBLIC" RateCode="norMAL" MinRate="100" MaxRate="1000" Currency="EUR" ReadOnly="Yes">
<RateName>normal Rate</RateName>
<R1 Name="Single Occupancy" MinRate="90.00" MaxRate="1500.00" />
<R2 Name="Double Occupancy" MinRate="120.00" MaxRate="2000.00" />
<R3 Name="2 Nights" MinRate="150.00" MaxRate="2000.00" />
</Rate>
</Rates>
</GetRatesRS>
</ServiceNameRQ>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
$result = $xml_query;
$result = stripslashes($result);
$result = simplexml_load_string($result);
$namespacesMeta = $result->getNamespaces(true);
$mediaXML = $result->children($namespacesMeta['SOAP-ENV:Header']);
$Interface = $mediaXML->xpath('//Interface');
$Credentials = $mediaXML->xpath('//Credentials');
$Client = $mediaXML->xpath('//Client');
$attributesInterface = $Interface[0]['@attributes'];
$PartnerID = $attributesInterface['PartnerID'];
$PartnerType = $attributesInterface['PartnerType'];
$Version = $attributesInterface['Version'];
$attributesCredentials = $Credentials[0]['@attributes'];
$HotelID = $attributesCredentials['HotelID'];
$User = $attributesCredentials['User'];
$Password = $attributesCredentials['Password'];
$HotelID = filter_var($HotelID, FILTER_SANITIZE_MAGIC_QUOTES);
$User = filter_var($User, FILTER_SANITIZE_MAGIC_QUOTES);
$Password = filter_var($Password, FILTER_SANITIZE_MAGIC_QUOTES);
$Password = tchag3iba($Password);
但是我无法检索SOAP-ENV:Body的内容(GetRatesRS-> Rates-> Rate)
解决方法:
可以通过以下方式访问费率数据:
$obj = simplexml_load_string($xml);
foreach($obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('urn:wsTest')->ServiceNameRQ->GetRatesRS->Rates->Rate as $rate)
{
echo (string)$rate->RateName . "\n";
}
Rack Rate
normal Rate
如果需要Rate属性,则可以这样获得它们(在循环内):
echo $rate->attributes()->RateID;
您可以像这样读取R1和R2元素:
foreach($obj->children('http://schemas.xmlsoap.org/soap/envelope/')->Body->children('urn:wsTest')->ServiceNameRQ->GetRatesRS->Rates->Rate as $rate)
{
if(isset($rate->R1))
{
echo $rate->R1->attributes()->Name;
echo $rate->R1->attributes()->MinRate;
}
if(isset($rate->R2))
{
echo $rate->R2->attributes()->Name;
echo $rate->R2->attributes()->MinRate;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。