draxu26480 2010-03-28 12:42
浏览 56
已采纳

xml到hashmap - php

Given an xml structure like this

<gesmes:Envelope>
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time="2010-03-26">
<Cube currency="USD" rate="1.3353"/>
<Cube currency="JPY" rate="124.00"/>
<Cube currency="BGN" rate="1.9558"/>
<Cube currency="CZK" rate="25.418"/>
...
...
</Cube>
</Cube>
</gesmes:Envelope>

how can i go about getting the values stored in to a hashmap or similar structure in php?

Have been trying to do this for the last few hours now but cant manage it :D

It is homework so i guess no full solutuins please( tho the actual assignment is to use the web services, i am just stuck with parsing it :D ). Maybe someone could show me a brief example for a made up xml file that i could apply to mine?

Thanks

  • 写回答

2条回答 默认 最新

  • du22399 2010-03-28 13:16
    关注

    <gesmes:Envelope> is probably not the "whole truth". A prefix like gesmes: needs to be associated with an uri. In your case it's probably

    <gesmes:Envelope
      xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
      xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
    >
    

    And now you have to deal with namespaces....

    There is php's simplexml module. It has some shortcomings when namespaces are involved. But anyway... here it is:

    $s = new SimpleXMLelement(getData());
    foreach( $s->Cube as $cubeContainer) {
      foreach( $cubeContainer as $cubeEntry) {
        echo 'time: ', $cubeEntry['time'], "
    ";
        foreach( $cubeEntry->Cube as $cubeElement) {  
          echo '  ', $cubeElement['currency'], '=', $cubeElement['rate'], "
    ";
        }
      }
    }
    
    // now that was easy ...now the fun of having namespaces/prefixes
    foreach( $s->children("http://www.gesmes.org/xml/2002-08-01")->subject as $subject) {
      echo 'subject: ', $subject, "
    ";
    }
    
    foreach( $s->children("http://www.gesmes.org/xml/2002-08-01")->Sender as $sender) {
      foreach( $sender->children("http://www.gesmes.org/xml/2002-08-01")->name as $name) {
        echo 'sender/name: ', $name, "
    ";
      }
    }
    
    
    
    function getData() {
      return '<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
        <gesmes:subject>Reference rates</gesmes:subject>
        <gesmes:Sender>
          <gesmes:name>European Central Bank</gesmes:name>
        </gesmes:Sender>
        <Cube>
          <Cube time="2010-03-26">
            <Cube currency="USD" rate="1.3353"/>
            <Cube currency="JPY" rate="124.00"/>
            <Cube currency="BGN" rate="1.9558"/>
            <Cube currency="CZK" rate="25.418"/>
          </Cube>
        </Cube>
      </gesmes:Envelope>';
    }
    

    prints

    time: 2010-03-26
      USD=1.3353
      JPY=124.00
      BGN=1.9558
      CZK=25.418
    subject: Reference rates
    sender/name: European Central Bank
    

    If you want to use XPath to find specific elements/nodes (either SimpleXMLElement::xpath or DOMXPath which you would use with DOMDocument as pointed out by cletus) you have to register the namespace first.

    e.g.

    $s = new SimpleXMLelement(getData());
    $s->registerXPathNamespace('gesmes', 'http://www.gesmes.org/xml/2002-08-01');
    foreach($s->xpath('//gesmes:name[position()=1]') as $n){
      echo $n, "
    ";
    }
    

    prints European Central Bank.

    And there are other functions/methods to parse an XML document. E.g. XMLReader or (which is probably the closest to your your original quest "how can i go about getting the values stored in to a hashmap [...]?") xml_parse_into_struct()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog