XML в hashmap - php - PullRequest
       23

XML в hashmap - php

0 голосов
/ 28 марта 2010

Учитывая структуру 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">
<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?

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 28 марта 2010

Самый простой способ - использовать класс 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 голосов
/ 28 марта 2010

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

А теперь вам нужно разобраться с пространствами имен ....

Есть php's simplexml module . Он имеет некоторые недостатки, когда задействованы пространства имен . Но в любом случае ... вот оно:

$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 как указано 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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...