xml到hashmap-php
给定这样的xml结构xml到hashmap-php,php,html,arrays,hashmap,Php,Html,Arrays,Hashmap,给定这样的xml结构 <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"> <
<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或类似结构中 在过去的几个小时里,我一直在尝试做这件事,但是做不到 这是家庭作业,所以我想没有完整的解决方案(虽然实际的任务是使用web服务,但我只需要解析它:D)。也许有人可以给我举一个简单的例子,说明我可以应用到我的xml文件中
谢谢最简单的方法是使用
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);
可能不是“全部真相”。像gesmes:
这样的前缀需要与uri关联。你的情况可能是
<gesmes:Envelope
xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
>
如果要使用XPath查找特定的元素/节点(或者与as一起使用),必须首先注册名称空间
e、 g
打印欧洲中央银行
还有其他函数/方法可以解析XML文档。例如,或(可能与您最初的任务“如何将存储在哈希映射中的值获取到哈希映射[…]?”)“存储在哈希映射或类似结构中”-您能详细说明一下吗?键->值键是货币名称,值是汇率您知道其他方法吗,因为我现在无法做到这一点,因为有人在网上发布了一个解决方案:D
<gesmes:Envelope
xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"
>
$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
$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";
}