【问题标题】:How to get 2 child ID value from XML?如何从 XML 中获取 2 个子 ID 值?
【发布时间】:2018-01-07 16:48:45
【问题描述】:

我想尝试从 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 文档及其示例。 谢谢。

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    您可以尝试使用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 用于单个属性,例如 Volume

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

    【讨论】:

    • 感谢您提供两种解决方案!
    【解决方案2】:

    如果你只想接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);
    

    【讨论】:

    • 感谢您的简洁回答。只是为了澄清一下$xml 变量将&lt;Response&gt; 作为其默认根,然后你一直调用子节点直到你想要Level1Data 那么Level1Data[0]-&gt;... 代表什么?
    • 抱歉,我对您第一篇文章中的 $xml-&gt;Content-&gt;Level1Data[0]-&gt;attributes()-&gt;Volume; 语法感到更加困惑。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多