私はこれをxmlとして持っています:
<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>
すべてのevent:eventノードをループして、たとえば、すべてのevent:SessionKeyを表示するにはどうすればよいですか?
これは動作しません:
$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'));
}
xpathクエリでregisterXPathNamespace
および完全な名前空間プレフィックスなしで機能します。
$xml = new SimpleXMLElement($r);
foreach($xml->xpath('//event:event') as $event) {
var_export($event->xpath('event:sessionKey'));
}
使用する各simpleXMLElementオブジェクトの名前空間を登録する必要があります。
$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'));
}
名前空間は、xmlファイルのどこかで宣言する必要もあります。
<event:event xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
...
説明したメソッドaxも機能します。 xmlファイルが常に同じプレフィックスを使用することがわかっている場合は、registerXPathNamespaceをスキップできます。
ここで私のために働いた代替。
$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;
}
Simplexmlで多くの作業を行ったので、これが私の方法です。
既に要素があり、異なる名前空間の子を取得したい場合の魔法のトリック、たとえば次のような構造の場合:
<entry>
<title type="text">My test entry</title>
<Gd:when startTime="2017-02-26T02:00:00Z" endTime="2017-02-26T03:00:00Z"/>
<gc:notes type="string">A type</gc:notes>
</entry>
子関数の2番目のパラメーターとしてtrueを送信します。
$title = (string) $entry->title;
$Gd = $entry->children('Gd', TRUE);
$attrs = $Gd->when->attributes();
$startTime = (string) $attrs->startTime;
$gc = $entry->children('gc', TRUE);
$notes = (string) $gc->notes();
別のアプローチは、解析にSimpleXML
を使用し、操作/アクセスにDOMDocument
を使用することです。これにより、ネームスペースの問題を完全に回避できます。
$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;
}
registerXPathNamespace
を使用してからxpath
を呼び出すことは実際にはうまくいきませんでした。この素晴らしい投稿で提供されているソリューションを使用する必要がありました: http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html
あなたの場合、これは:
echo $xml->children('http://www.webex.com/schemas/2002/06/service/event')->sessionName;
出力されます:
数分でQBを学ぶ