php xml解析 命名空间,php-使用SimpleXML使用命名空间解析XML

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 entry

A 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值