2010-03-28 3 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> 

, как я могу идти о получении значения, хранящиеся в к HashMap или аналогичной структуры в PHP?

пытаются сделать это в течение последних нескольких часов в настоящее время, но не могу управлять им: D

Это домашнее задание, так что я не думаю, нет полной solutuins пожалуйста (Тхо фактическое назначение заключается в использовании веб-службы, я просто застрял в разборе: D). Может быть, кто-то может показать мне краткий пример для составленного XML-файла, который я мог бы применить к моему?

Благодаря

+0

«хранится в хэш-карте или аналогичной структуре» - можете ли вы немного разобраться в этом? – VolkerK

+0

ключ -> значение ключ, являющийся валютным наименованием, значение которого является обменным курсом – csU

ответ

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

Существует РНР 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::xpath или DOMXPath, которые вы будете использовать с DOMDocument как pointed 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

Смежные вопросы