SimpleXML kullanarak ad alanı ile XML Ayrıştırma

6 Cevap php

Ben xml olarak bu var:

<root xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
    <event:event>
        <event:sessionKey></event:sessionKey>
        <event:sessionName>Learn QB in Minutes</event:sessionName>
        <event:sessionType>9</event:sessionType>
        <event:hostWebExID></event:hostWebExID>
        <event:startDate>02/12/2009</event:startDate>
        <event:endDate>02/12/2009</event:endDate>
        <event:timeZoneID>11</event:timeZoneID>
        <event:duration>30</event:duration>
        <event:description></event:description>
        <event:status>NOT_INPROGRESS</event:status>
        <event:panelists></event:panelists>
        <event:listStatus>PUBLIC</event:listStatus>
    </event:event>
    ...
</root>

Nasıl olayın tüm aracılığıyla I döngü can: Olay düğümleri ve ekran, örneğin, olayın tüm: SessionKey ait?

Bu işe yaramazsa:

$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');

foreach($xml->xpath('//e:event') as $event) {
 var_export($event->xpath('//e:sessionKey'));
}

6 Cevap

Kullandığınız her SimpleXMLElement nesne için ad kaydetmek zorunda.

$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');

foreach($xml->xpath('//e:event') as $event) {
    $event->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
    var_export($event->xpath('//e:sessionKey'));
}

Ad da bir yere xml dosyasında beyan edilmelidir.

<event:event xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
...

Yöntem balta çok çalışmalarını anlattı. Eğer xml dosyası her zaman aynı önek kullanmak biliyorum eğer registerXPathNamespace atlayabilirsiniz.

o registerXPathNamespace ve XPath sorguları tam ad alanı öneki olmadan çalışır:

$xml = new SimpleXMLElement($r);

foreach($xml->xpath('//event:event') as $event) {
 var_export($event->xpath('event:sessionKey'));
}

Başka bir yaklaşım tamamen namespacing sorunları atlar manipülasyon / erişimi için SimpleXML ayrıştırma ve DOMDocument kullanmaktır:

$xml = new SimpleXMLElement($r);
$xml = dom_import_simplexml($xml);
$nodelist= $xml->getElementsByTagName('event');  
for($i = 0; $i < $nodelist->length; $i++) {
    $sessions = $nodelist->item($i)->getElementsByTagName('sessionKey');
    echo $sessions->item(0)->nodeValue;
}

Using registerXPathNamespace and then calling xpath didn't actually work for me. I had to go with the solution provided in this great post : http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html

Yani senin durumunda, bu:

echo $xml->children('http://www.webex.com/schemas/2002/06/service/event')->sessionName;

Çıktısı:

Dakika QB öğrenin

Benim için çalıştı buradan alternatif.

$xml = simplexml_load_string($r);
$ns = $xml->getNamespaces(true);

foreach ($xml->children($ns['event'])->event as $skey) {
    $sessionKey = $skey->children($ns['event'])->sessionKey;
    echo $sessionKey;
}

Ben yanlış olabilir ama ben SOAP gibi kolon sembolü ile XML SimpleXMLElement kullanılarak düzgün bir şekilde çözümlenebilir sanmıyorum.

Ben bunu daha şık bir yolu vardır eminim ama ben genellikle file_get_contents() sonra yerine / o SimpleXMLElement göndermek sonra iki nokta üst üste çıkarın kullanarak bir değişken içine dosya içeriğini okuyun.