2010-03-28 3 views
0

XML 해시 맵하기 - 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에서 해시 맵 또는 유사한 구조에 저장된 값을 얻기에 관하여 갈 수있는이 같은 XML 구조를 감안할 때?

이제 지난 몇 시간 동안이 일을 시도하고있다 그러나 그것을 관리하지 못할 : 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 다루는 .... 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::xpath 또는 DOMXPath 당신이 pointed out by cletusDOMDocument 사용할 것이다) 네임 스페이스를 먼저 등록해야합니다.

$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

입니다. 온라인에서 누군가가 게시 한 솔루션으로이를 수행 할 수 없으므로 다른 방법을 알고 계십니까? – csU