2011-07-05 25 views
4

我是SOAP的新手。我无法将此请求转换为数组。这个xml数组应该是字符串类型。如何将这个XML请求转换为PHP中的数组?

XML请求:

<OTA_HotelAvailRQ Version="1.0"> 
    <POS> 
    <Source> 
    <UniqueId Id="20000704abcde:105ABCDE" /> 
    </Source> 
    </POS> 
    <AvailRequestSegments> 
    <AvailRequestSegment> 
    <StayDateRange End="2011-08-15" Start="2011-08-14" /> 
    <RoomStayCandidates> 
     <RoomStayCandidate Quantity="1"> 
     <GuestCounts> 
     <GuestCount AgeQualifyingCode="10" Count="1" /> 
     </GuestCounts> 
     </RoomStayCandidate> 
    </RoomStayCandidates> 
    <HotelSearchCriteria> 
     <Criterion> 
     <HotelRef Destination="East London, South Africa" CityCode="" CountryCode="" HotelName="" MinHotelRating="1"/> 
     <SearchCurrency>EUR</SearchCurrency> 
     <AdditionalInfo Value="1" /> 
     <Language>EN</Language> 
     </Criterion> 
    </HotelSearchCriteria> 
    </AvailRequestSegment> 
    </AvailRequestSegments> 
    </OTA_HotelAvailRQ> 

XML响应

<OTA_HotelAvailRS Version="1.0"> 
    <Success Id="24064"/> 
    <Properties> 
      <Property HotelCityCode="4162" HotelCode="6001287" HotelName="Amaryllis"> 
       <RelativePosition Direction="" Distance="0" DistanceUnitName=""/> 
       <RoomStays> 
        <RoomStay> 
         <RatePlans> 
           <RatePlan RatePlanCode="12201993"/> 
         </RatePlans> 
         <RoomRates> 
           <RoomRate> 
            <Rates> 
             <Rate EffectiveDate="2010-06-12" ExpireDate="2010-06-13"> 
              <Base Amount="76.00" CurrencyCode="EUR"/> 
              <RateDescription Adults="1" Availability="A" Children="0" RoomNum="1"> 
                <![CDATA[Single room]]> 
              </RateDescription> 
             </Rate> 
            </Rates> 
           </RoomRate> 
         </RoomRates> 
         <Meals Description="Buffet B'Fast (continental)"/> 
         <EssentialInfo>Here comes essential information</EssentialInfo> 
        </RoomStay>           
       </RoomStays> 
       <Promotions/> 
       <AdditionalInfo> 
        <HotelStarDetail rating="2"/> 
        <HotelImages> 
         <HotelImage Type="Bedroom" URL="https://www.miki.co.uk/live/hotel/mikiNet/image/v1.0/FR/4162/419/lr/room.jpg"/> 
         <HotelImage Type="Bedroom"         URL="https://www.miki.co.uk/live/hotel/mikiNet/image/v1.0/FR/4162/419/lr/room1.jpg"/> 
        </HotelImages> 
        <HotelDescription> 
         <LongDescription>This 2 star hotel is located in the city centre of Nice. It is close 
         to the Beach. The Hotel has a restaurant.</LongDescription> 
        </HotelDescription> 
       </AdditionalInfo> 
      </Property> 
    </Properties> 
</OTA_HotelAvailRS> 
+0

你想要将XML转换为数组的结构是什么?你有任何解决方法,或者你只是想让别人为你写代码(面临问题或不知道如何)? – Nemoden

+0

其实我不知道如何将xml编写成数组来传递_soapCAll()。以前,我做过这样的事情。 $ xml =' .....'; – Hearaman

+0

_soapCall(“function”,array($ xml))。它不工作。 – Hearaman

回答

11

将这个类转换XML到阵列进行命名为 “xmlParser.class.php” 文件复制粘贴下面的代码给它。

<?php 
/** 
* xmlParser 
* 
* @author  shashank Patel 
*/ 

class xmlParser 
{ 
    public $ssBlankShow = true; 

    /** 
    * @todo convert xml to array 
    * @param string $contents 
    * @param string $get_attributes 
    * @param string $priority 
    * @access public 
    * @return mixed 
    */ 
    public function xml2array($contents, $get_attributes=1, $priority = 'tag') 
    { 
     if(!$contents) 
      return array(); 

     if(!function_exists('xml_parser_create')) 
     { 
      return array(); 
     } 

     $parser = xml_parser_create(''); 
     xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); 
     xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); 
     xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); 
     xml_parse_into_struct($parser, trim($contents), $xml_values); 
     xml_parser_free($parser); 

     if(!$xml_values) 
      return; 

     $xml_array = array(); 
     $parents = array(); 
     $opened_tags = array(); 
     $arr = array(); 

     $current = &$xml_array; 

     $repeated_tag_index = array(); 

     foreach($xml_values as $data) 
     { 
      unset($attributes,$value); 

      extract($data); 

      $result = array(); 

      $attributes_data = array(); 

      if(isset($value)) 
      { 
       if($priority == 'tag') 
        $result = $value; 
       else 
        $result['value'] = $value; 
      } 

      if(isset($attributes) and $get_attributes) 
      { 
       foreach($attributes as $attr => $val) 
       { 
        if($priority == 'tag') 
         $attributes_data[$attr] = $val; 
        else 
         $result['attr'][$attr] = $val; 
       } 
      } 

      if($type == "open") 
      { 
       $parent[$level-1] = &$current; 
       if(!is_array($current) or (!in_array($tag, array_keys($current)))) 
       { 
        $current[$tag] = $result; 

        if($attributes_data) 
         $current[$tag. '_attr'] = $attributes_data; 

        $repeated_tag_index[$tag.'_'.$level] = 1; 

        $current = &$current[$tag]; 

       } 
       else 
       { 
        if(isset($current[$tag][0])) 
        { 
         $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; 

         $repeated_tag_index[$tag.'_'.$level]++; 
        } 
        else 
        { 
         $current[$tag] = array($current[$tag],$result); 

         $repeated_tag_index[$tag.'_'.$level] = 2; 

         if(isset($current[$tag.'_attr'])) 
         { 
          $current[$tag]['0_attr'] = $current[$tag.'_attr']; 

          unset($current[$tag.'_attr']); 
         } 

        } 
        $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1; 
        $current = &$current[$tag][$last_item_index]; 
       } 

      } 
      elseif($type == "complete") 
      { 
       if(!isset($current[$tag])) 
       { 
        $current[$tag] = $result; 
        $repeated_tag_index[$tag.'_'.$level] = 1; 
        if($priority == 'tag' and $attributes_data) 
         $current[$tag. '_attr'] = $attributes_data; 

       } 
       else 
       { 
        if(isset($current[$tag][0]) and is_array($current[$tag])) 
        { 
         $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; 

         if($priority == 'tag' and $get_attributes and $attributes_data) 
         { 
          $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; 
         } 

         $repeated_tag_index[$tag.'_'.$level]++; 

        } 
        else 
        { 

         $current[$tag] = array($current[$tag],$result); 

         $repeated_tag_index[$tag.'_'.$level] = 1; 

         if($priority == 'tag' and $get_attributes) 
         { 
          if(isset($current[$tag.'_attr'])) 
          { 
           $current[$tag]['0_attr'] = $current[$tag.'_attr']; 
           unset($current[$tag.'_attr']); 
          } 

          if($attributes_data) 
          { 
           $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; 
          } 
         } 
         $repeated_tag_index[$tag.'_'.$level]++; 
        } 
       } 

      } 
      elseif($type == 'close') 
      { 
       $current = &$parent[$level-1]; 
      } 
     } 

     return($xml_array); 
    } 

    /** 
    * @todo convert array to xml 
    * @param mixed $array 
    * @param string $level 
    * @param string $KeyForBlank 
    * @access public  
    * @return mixed 
    */ 
    public function array_to_xml($array, $level=1, $KeyForBlank = 'row') 
    { 
     $xml = ''; 

     if ($level==1) 
     { 
      $xml .= '<?xml version="1.0" encoding="UTF-8"?>'. 
       "<musicbox><response>"; 
     } 
     else if($level==11) 
     { 
      $xml .= '<?xml version="1.0" encoding="UTF-8"?>'."\n". 
       "<xml>"; 
     } 
     foreach ($array as $key=>$value) 
     { 

      $key = strtolower($key); 
      $eleKey = $key; 

      if (is_array($value)) 
      { 
       if(sizeof($value)) { 
        if (preg_match('/^\d+$/', $eleKey)) $eleKey = $KeyForBlank; 
        $xml .= str_repeat("",$level)."<$eleKey>"; 
        $level++; 
        $xml .= $this->array_to_xml($value, $level, $KeyForBlank); 
        $level--; 
        $xml .= str_repeat("",$level)."</$eleKey>"; 
       } 
       else 
       { 
        if($eleKey == 'genre' || $this->ssBlankShow == true) 
         $xml .= str_repeat("",$level)."<$eleKey></$eleKey>"; 
        else 
         $xml .= str_repeat("",$level)."<$eleKey />"; 
       } 
      } 
      else 
      { 
       if (trim($value)!='') 
       { 
        if (preg_match('/^\d+$/', $eleKey)) $eleKey = $KeyForBlank; 
        if (htmlspecialchars($value)!=$value || $this->otherchar($value)) 
        { 
         $xml .= str_repeat("",$level). 
           "<$eleKey>$value</$eleKey>"; 
        } 
        else 
        { 
         $xml .= str_repeat("",$level). 
          "<$eleKey>$value</$eleKey>"; 
        } 
       } 
       else 
       { 
        if($eleKey == 'genre' || $this->ssBlankShow == true) 
         $xml .= str_repeat("",$level)."<$eleKey></$eleKey>"; 
        else 
         $xml .= str_repeat("",$level)."<$eleKey />"; 
       } 
      } 
     } 
     if ($level==1) 
     { 
      $xml .= "</response></musicbox>"; 
     } 
     else if($level==11) 
     { 
      $xml .= "</xml>"; 
     } 
     return $xml; 
    } 
    /** 
    * @todo remove other char ('/\:/') 
    * @param string $str 
    * @access public  
    * @return mixed 
    */ 


    public function otherchar($str) 
    { 
     return preg_match('/\:/', $str); 
    } 

} 

后,使一个名为包含下面的代码“test.php的”文件:

<?php 

$ssString = '<OTA_HotelAvailRQ Version="1.0"><POS><Source><UniqueId Id="20000704abcde:105ABCDE" /></Source></POS><AvailRequestSegments><AvailRequestSegment><StayDateRange End="2011-08-15" Start="2011-08-14" /> 
      <RoomStayCandidates><RoomStayCandidate Quantity="1"><GuestCounts><GuestCount AgeQualifyingCode="10" Count="1" /></GuestCounts></RoomStayCandidate></RoomStayCandidates> 
      <HotelSearchCriteria><Criterion><HotelRef Destination="East London, South Africa" CityCode="" CountryCode="" HotelName="" MinHotelRating="1"/><SearchCurrency>EUR</SearchCurrency> 
      <AdditionalInfo Value="1" /><Language>EN</Language></Criterion></HotelSearchCriteria></AvailRequestSegment></AvailRequestSegments></OTA_HotelAvailRQ>'; 

include 'xmlParser.class.php'; 

$oXmlParser = new xmlParser(); 
$asArray = $oXmlParser->xml2array($ssString); 
$asArray1 = $oXmlParser->xml2array($ssString,''); 
$asArray2 = $oXmlParser->xml2array($ssString,1,''); 
echo "<pre>"; 
print_r($asArray); 
exit; 
?> 

试试这个如有不便,请通知我,如果我可以帮你。

这是三种不同类型的数组,你可以通过改变下面的参数来获得满足你需求的任何数组。

$asArray = $oXmlParser->xml2array($ssString); 

$asArray1 = $oXmlParser->xml2array($ssString,''); 

$asArray2 = $oXmlParser->xml2array($ssString,1,''); 
+0

感谢Patel的帮助。 – Hearaman

+0

它给了精彩的结构化数组。我把这个数组保存在一个变量中,我将这个变量作为_soapCall(“OTA_HotelAvailRQ”,$ variable);传递给了soapcall方法。但在源代码视图中,它显示为无效的xml。 – Hearaman

2

您可能想试试这个。创建对象,将对象编码为json,并将json字符串解码为数组。

$内容= ...一些XML内容...

$内容= json_decode(json_encode(simplexml_load_string($内容)), 真);