如何从XML获取2个子ID值?

时间:2017-08-01 00:48:55

标签: php xml dom

我想尝试从Level1Data节点中获取Volume值。 这是xml:

<Response>
  <Content>
    <Level1Data Tick="U" Currency="USD" TickSize="0.0001000000" TickValue="0" AssetClass="Equity" InstrumentState="Open" LastPrice="24.1550" LotSize="10"
      MinPermittedPrice="0" MaxPermittedPrice="0" ClosePrice="24.0300" OpenPrice="24.1500" FirstPrice="24.1500"
      HighPrice="24.7800" LowPrice="24.0000" MaxPrice="24.7800" MinPrice="24.0000" Volume="16238302"
      AskSize="105597" BidSize="97618" AskPrice="24.1600" BidPrice="24.1500" Symbol="BAC.NY"
      MarketTime="12:08:41.356" Message="L1DB"/>
  </Content>
</Response>

然后是我的主要剧本:

<?php
$result = file_get_contents("lvl1.xml");
// echo $result;
$xml = new SimpleXMLElement($result);
// $dom = new DOMDocument();
// $dom->loadXML("lvl1.xml");
// $vol = dom->getElementsByTagName('Level1Data');

$vol=$xml->children->children('Level1Data');
$id = $xml["Volume"];
echo $id;

 ?>

没有返回任何内容,我很难阅读php文档及其示例。 谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用attributes()foreach根据您的要求找到您想要的属性的XML节点。如果您只需要单个属性,则丢弃foreach循环。

<?php
$result =<<<EOT
<Response>
      <Content>
        <Level1Data Tick="U" Currency="USD" TickSize="0.0001000000" TickValue="0" AssetClass="Equity" InstrumentState="Open" LastPrice="24.1550" LotSize="10"
          MinPermittedPrice="0" MaxPermittedPrice="0" ClosePrice="24.0300" OpenPrice="24.1500" FirstPrice="24.1500"
          HighPrice="24.7800" LowPrice="24.0000" MaxPrice="24.7800" MinPrice="24.0000" Volume="16238302"
          AskSize="105597" BidSize="97618" AskPrice="24.1600" BidPrice="24.1500" Symbol="BAC.NY"
          MarketTime="12:08:41.356" Message="L1DB"/>
      </Content>
    </Response>
EOT;

    $volume = '';
    $xml = new SimpleXMLElement($result);
    foreach($xml->Content->Level1Data[0]->attributes() as $a => $b) {
        if($a=='Volume'){
          $volume = $b;
        }
    }
    echo $volume;
?>

演示https://eval.in/839942

单个属性的

OR ,例如音量

 echo $xml->Content->Level1Data[0]->attributes()->Volume;

答案 1 :(得分:0)

如果您只想提取Volume,也可以按照以下方式进行操作。

<?php

$result = <<<EOM
<Response>
  <Content>
    <Level1Data Tick="U" Currency="USD" TickSize="0.0001000000" TickValue="0" AssetClass="Equity" InstrumentState="Open" LastPrice="24.1550" LotSize="10"
      MinPermittedPrice="0" MaxPermittedPrice="0" ClosePrice="24.0300" OpenPrice="24.1500" FirstPrice="24.1500"
      HighPrice="24.7800" LowPrice="24.0000" MaxPrice="24.7800" MinPrice="24.0000" Volume="16238302"
      AskSize="105597" BidSize="97618" AskPrice="24.1600" BidPrice="24.1500" Symbol="BAC.NY"
      MarketTime="12:08:41.356" Message="L1DB"/>
  </Content>
</Response>
EOM;

$xml = new SimpleXMLElement($result);

echo $xml->Content->Level1Data[0]->attributes()->Volume;

修改

<?php

$result = <<<EOM
<Response>
  <Content>
    <Level1Data Tick="U" Currency="USD" TickSize="0.0001000000" TickValue="0" AssetClass="Equity" InstrumentState="Open" LastPrice="24.1550" LotSize="10"
      MinPermittedPrice="0" MaxPermittedPrice="0" ClosePrice="24.0300" OpenPrice="24.1500" FirstPrice="24.1500"
      HighPrice="24.7800" LowPrice="24.0000" MaxPrice="24.7800" MinPrice="24.0000" Volume="16238302"
      AskSize="105597" BidSize="97618" AskPrice="24.1600" BidPrice="24.1500" Symbol="BAC.NY"
      MarketTime="12:08:41.356" Message="L1DB"/>
  </Content>
</Response>
EOM;

$xml = new SimpleXMLElement($result);

function recur($obj){
  if ( in_array('Level1Data', array_keys( (array) $obj->children()) ) === false){
    recur($obj->children());
  }else{
    var_dump($obj->children()->Level1Data);
    exit;
  }
}

recur($xml);