php-使用SimpleXML使用命名空间解析XML
我有这个作为xml:
Learn QB in Minutes
9
02/12/2009
02/12/2009
11
30
NOT_INPROGRESS
PUBLIC
...
如何遍历所有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'));
}
6个解决方案
28 votes
它无需registerXPathNamespace和xpath查询中的完整名称空间前缀即可工作:
$xml = new SimpleXMLElement($r);
foreach($xml->xpath('//event:event') as $event) {
var_export($event->xpath('event:sessionKey'));
}
ax. answered 2020-01-28T03:00:45Z
21 votes
您必须为使用的每个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文件中的某个位置声明。
...
所描述的方法也适用。 如果您知道xml文件将始终使用相同的前缀,则可以跳过registerXPathNamespace。
mcrumley answered 2020-01-28T03:01:14Z
15 votes
这对我有用的替代方法。
$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;
}
ewwink answered 2020-01-28T03:01:34Z
12 votes
与simplexml一起工作了很多,这就是我的方法。
如果您已经有了一个元素并且只想获取它的不同名称空间的子元素,那么魔术就是这样的结构:
My test entryA type
将true作为第二个参数发送给children函数:
$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();
Cameron answered 2020-01-28T03:02:03Z
6 votes
另一种方法是使用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;
}
Asad Saeeduddin answered 2020-01-28T03:02:23Z
4 votes
使用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
Raf answered 2020-01-28T03:02:56Z