2010-03-28 30 views
0

給定一個XML結構是這樣XML來HashMap的 - PHP

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

我怎麼能去獲取存儲在在PHP中一個HashMap或類似結構的價值觀?

一直在努力,現在在過去的幾年時間做到這一點,但不能對其進行管理:d

這是家庭作業,所以我想沒有完全solutuins請(壽的實際分配是使用Web服務,我是隻是堅持解析它:D)。也許有人可以給我一個簡單的例子,用於編寫一個可以應用於我的XML文件?

感謝

+0

「存儲在哈希映射或類似結構中」你能詳細解釋一下嗎? – VolkerK 2010-03-28 12:54:37

+0

鍵 - >值 鍵是貨幣名稱,價值是匯率 – csU 2010-03-28 13:08:58

回答

0

<gesmes:Envelope>可能不是 「全部真相」。像gesmes:這樣的前綴需要與uri關聯。在你的情況下,它可能是

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

現在你要處理namespaces ....

有PHP的simplexml module。它有一些shortcomings when namespaces are involved。但無論如何...這裏是:

$s = new SimpleXMLelement(getData()); 
foreach($s->Cube as $cubeContainer) { 
    foreach($cubeContainer as $cubeEntry) { 
    echo 'time: ', $cubeEntry['time'], "\n"; 
    foreach($cubeEntry->Cube as $cubeElement) { 
     echo ' ', $cubeElement['currency'], '=', $cubeElement['rate'], "\n"; 
    } 
    } 
} 

// 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, "\n"; 
} 

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, "\n"; 
    } 
} 



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>'; 
} 

打印

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

如果你想使用XPath來查找特定元素/節點(或SimpleXMLElement::xpathDOMXPath,你將與DOMDocumentpointed out by cletus使用)你必須先註冊命名空間。

例如

$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, "\n"; 
} 

打印European Central Bank

還有其他解析XML文檔的函數/方法。例如。 XMLReader或(這可能是最接近你的原始任務「我怎麼能得到存儲在哈希映射中的值?」)xml_parse_into_struct()

1

最簡單的方法是使用DOMDocument類。例如:

$src = <<<END 
<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> 
END; 

$xml = new DOMDocument; 
$xml->loadXML($src); 
$cubes = $xml->getElementsByTagName('Cube'); 
$currencies = array(); 
foreach ($cubes as $cube) { 
    $currency = $cube->getAttribute('currency'); 
    $rate = $cube->getAttribute('rate'); 
    if ($currency && $rate) { 
    $currencies[$currency] = $rate; 
    } 
} 
print_r($currencies); 

輸出:

Array 
(
    [USD] => 1.3353 
    [JPY] => 124.00 
    [BGN] => 1.9558 
    [CZK] => 25.418 
) 
+0

您是否知道其他任何方式,因爲我現在無法將其作爲由某人在線發佈的解決方案:D – csU 2010-03-28 13:06:41