2014-09-24 52 views
1

我有新的問題:PHP的XML - 通過它得到段的所有屬性的ID

有沒有辦法讓XML元素的所有屬性,當我選擇這個元素通過它的id?

我已經有了XML響應,看起來像這樣:

<availResponse> 
<tarifs currency="PLN"> 
<tarif tarifId="206844566_206844566" adtBuy="167.96" adtSell="167.96" chdBuy="167.96" chdSell="167.96" infBuy="167.96" infSell="167.96" taxMode="INCL" topCar="false" topHotel="false" adtCancel="0.0" chdCancel="0.0" infCancel="0.0" powerPricerDisplay="sell"> 
    <fareXRefs> 
    <fareXRef fareId="206844566"> 
    <flights> 
    <flight flightId="1663150500" addAdtPrice="0.0" addChdPrice="0.0" addInfPrice="0.0" extFlightInfo="Lowest Fare"> 
     <legXRefs> 
     <legXRef legId="1981746874" class="R" cos="E" cosDescription="ECONOMY" fareBaseAdt="LOWCOST"/> 
     </legXRefs> 
    </flight> 
    <flight flightId="1663150499" addAdtPrice="13.0" addChdPrice="13.0" addInfPrice="13.0" extFlightInfo="Lowest Fare"> 
     <legXRefs> 
     <legXRef legId="1981746874" class="R" cos="E" cosDescription="ECONOMY" fareBaseAdt="LOWCOST"/> 
     </legXRefs> 
    </flight> 
    </flights> 
    </fareXRef> 
    </fareXRefs> 
</tarif> 
</tarifs> 
<legs> 
<leg legId="1981746939" depApt="WAW" depDate="2014-10-09" depTime="06:20" dstApt="TXL" arrDate="2014-10-09" arrTime="07:45" equip="" fNo="8071" cr="AB" miles="0" elapsed="1.42" meals="no meals" smoker="false" stops="0" eticket="true" ocr="AB"/> 
<leg legId="1981747261" depApt="WAW" depDate="2014-10-09" depTime="17:25" dstApt="CPH" arrDate="2014-10-09" arrTime="18:45" equip="CR9" fNo="2752" cr="SK" miles="414" elapsed="1.33" meals="food and beverages for purchase" smoker="false" stops="0" eticket="true" ocr="SK" seats="8"/> 
<leg legId="1981747262" depApt="CPH" depDate="2014-10-09" depTime="20:10" dstApt="LHR" arrDate="2014-10-09" arrTime="21:10" equip="320" fNo="1501" cr="SK" miles="594" elapsed="2.0" meals="light lunch" smoker="false" stops="0" eticket="true" ocr="SK" seats="9"/> 
<leg legId="1981747267" depApt="LHR" depDate="2014-12-09" depTime="06:40" dstApt="CPH" arrDate="2014-12-09" arrTime="09:30" equip="320" fNo="500" cr="SK" miles="594" elapsed="1.83" meals="light lunch" smoker="false" stops="0" eticket="true" ocr="SK" seats="9"/> 
<leg legId="1981746874" depApt="WAW" depDate="2014-10-09" depTime="15:45" dstApt="CDG" arrDate="2014-10-09" arrTime="18:10" equip="319" fNo="1347" cr="AF" miles="0" elapsed="2.42" meals="" smoker="false" stops="0" eticket="true" ocr="AF" seats="9"/> 
<leg legId="1981747268" depApt="CPH" depDate="2014-12-09" depTime="15:35" dstApt="WAW" arrDate="2014-12-09" arrTime="16:55" equip="CR9" fNo="2751" cr="SK" miles="414" elapsed="1.33" meals="food and beverages for purchase" smoker="false" stops="0" eticket="true" ocr="SK" seats="9"/> 
<leg legId="1981746966" depApt="ZRH" depDate="2014-12-09" depTime="19:20" dstApt="TXL" arrDate="2014-12-09" arrTime="20:45" equip="" fNo="8199" cr="AB" miles="0" elapsed="1.42" meals="no meals" smoker="false" stops="0" eticket="true" ocr="AB"/> 
<leg legId="1981747462" depApt="LHR" depDate="2014-12-09" depTime="17:50" dstApt="BRU" arrDate="2014-12-09" arrTime="20:00" equip="AR1" fNo="2096" cr="SN" miles="0" elapsed="1.17" meals="" smoker="false" stops="0" eticket="true" ocr="SN" seats="9"/> 
</legs> 
</availResponse> 

,現在是瘋狂:)

我得到的每'legId'從屬性的每個tarif-> fareXRefs - > fareXRef->機票 - >機票 - > legXRefs-> legXRef

$counted = $test['cntTarifs']; 

for($i=0; $i < $counted; $i++) { 
    $test4 = $test->tarifs->tarif[$i]->fareXRefs; 
    $test5 = $test4->fareXRef->flights; 
    $test6 = $test5->flight->legXRefs->legXRef; 
    $segment= $test->legs->leg; 

//now we're getting every needed thing 
foreach($test5 as $keyless) { //sorting each flight element 
    foreach($test6 as $key) { //takingout every legXRef in each flight element 
     $id = $key['legId']; //this is what i'm looking for 

     echo "<br />".$id; 

     foreach($segment as $seg) { //trying to find leg 
      if($seg['legId'] == $id){ //if legId in leg equals to $id 
       echo $seg['dstApt']; // try to get another attribute and that doesn't work 
      } 
     } 
    } 
} 
} 

我需要讓每一個貢獻存在於腿與選擇legId但我的思想失敗:(

回答

0

這裏是屬性節點SimpleXML中另一種支持xpath查詢元素和屬性的方法。

那麼下面的代碼所做的是選擇在legId屬性中具有特定值的<leg>元素的所有屬性。

然後,$data陣列是基於屬性名稱和值內置:

$xml  = simplexml_load_string($buffer); 
$legId  = '1981746939'; 
$attributes = $xml->xpath(sprintf("(//leg[@legId=%d])[1]/@*", $legId)); 
$data  = null; 
foreach ($attributes as $attribute) { 
    $data[$attribute->getName()] = (string)$attribute; 
} 
print_r($data); 

結果:

Array 
(
    [legId] => 1981746939 
    [depApt] => WAW 
    [depDate] => 2014-10-09 
    [depTime] => 06:20 
    [dstApt] => TXL 
    [arrDate] => 2014-10-09 
    [arrTime] => 07:45 
    [equip] => 
    [fNo] => 8071 
    [cr] => AB 
    [miles] => 0 
    [elapsed] => 1.42 
    [meals] => no meals 
    [smoker] => false 
    [stops] => 0 
    [eticket] => true 
    [ocr] => AB 
) 
1

您可以使用xpath這種情況。例如:

$legId = '1981746939'; 

$node = $xml->xpath("//leg[@legId='$legId']"); // target the specific leg with this legId 
if(count($node) <= 0) { 
    echo 'none found'; // exit if none found 
    exit; 
} 
$data = array(); 
foreach($node[0]->attributes() as $att => $val) { // if found, loop all the attributes 
    $data[$att] = (string) $val; 
} 

echo $data['dstApt']; // TXL 
echo '<pre>'; 
print_r($data); 

Sample Output

+0

哈奏效魅力感謝@Ghost – arclite 2014-09-24 12:49:55

+0

@arclite真高興它幫助 – Ghost 2014-09-24 12:50:53

+0

像@ ghost:只是FYI:通過xpath的屬性已經可能了:http://stackoverflow.com/a/26318999/367456 – hakre 2014-10-11 20:37:04

0

用SimpleXML,你必須與attributes()方法來檢查您的屬性:

$wanted_legId = '1981747267'; 

foreach ($xml->legs->leg as $leg) { 
    $tmp = $leg->attributes(); 
    if($tmp['legId'] == $wanted_legId) { 
    $wanted_attributes = $tmp; 
    break; 
    } 
} 

echo $wanted_attributes['dstApt']; 

輸出:

CPH

1

SimpleXML是面向元素節點的,爲了獲取屬性,您將需要PHP中額外的邏輯或使用DOM + Xpath。

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXpath($dom); 

$attributes = []; 
foreach ($xpath->evaluate('//legs/leg[@legId = "1981746939"][1]/@*') as $attribute) { 
    $attributes[$attribute->name] = $attribute->value; 
} 

var_dump($attributes); 

輸出:

array(17) { 
    ["legId"]=> 
    string(10) "1981746939" 
    ["depApt"]=> 
    string(3) "WAW" 
    ["depDate"]=> 
    string(10) "2014-10-09" 
    ["depTime"]=> 
    string(5) "06:20" 
    ["dstApt"]=> 
    string(3) "TXL" 
    ["arrDate"]=> 
    string(10) "2014-10-09" 
    ["arrTime"]=> 
    ... 

XPath表達式查找一個legs元件節點

//legs 

得到它leg兒童

//legs/leg 

它限制的那些機智公頃特定屬性值

//legs/leg[@legId = "1981746939"] 

可以確保只有一個節點是從結果

//legs/leg[@legId = "1981746939"][1] 

選擇第一和獲取所有從該元件節點

//legs/leg[@legId = "1981746939"][1]/@* 
+0

simplexml xpath也會返回屬性節點 - http://stackoverflow.com/a/26318999/367456 – hakre 2014-10-11 20:32:51