繁体   English   中英

PHP XML-通过ID获取细分的所有属性

[英]PHP XML - get all attributes of segment by it's id

我有一个新问题:

当我通过其ID选择元素时,有没有办法获取xml元素的所有属性?

我有看起来像这样的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>

现在疯了:)

我从每个tarif-> fareXRefs-> fareXRef-> flights-> flight-> legXRefs-> legXRef中获取每个'legId'属性

$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获取存在于leg中的每个属性,但是我的想法失败了:(

您可以在这种情况下使用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);

样本输出

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]/@*

使用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

这是SimpleXML中另一种在xpath中支持查询元素和属性的方式。

因此,以下代码要做的是选择<leg>元素的legId属性中具有特定值的legId属性。

然后根据属性名称和值构建$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
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM