当前位置:  开发笔记 > 编程语言 > 正文

使用SimpleXML使用命名空间解析XML

如何解决《使用SimpleXML使用命名空间解析XML》经验,为你挑选了5个好方法。

我把它作为xml:


    
        
        Learn QB in Minutes
        9
        
        02/12/2009
        02/12/2009
        11
        30
        
        NOT_INPROGRESS
        
        PUBLIC
    
    ...

我如何遍历所有事件:事件节点和显示,例如,所有事件: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'));
}

ax... 28

它没有registerXPathNamespace和xpath查询中的完整名称空间前缀一起工作:

$xml = new SimpleXMLElement($r);

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

是的,不,实际上我认为这是一个错误.PHP自动注册当前上下文的名称空间.这甚至会覆盖您自己注册的命名空间.您的源基于您加载的文档中使用的前缀.您无法控制的外部来源.前缀是可选的,不明确的,可以随时更改.命名空间是定义的,唯一且稳定的 - 前缀/别名不是. (8认同)


mcrumley.. 21

您必须为您使用的每个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.



1> ax...:

它没有registerXPathNamespace和xpath查询中的完整名称空间前缀一起工作:

$xml = new SimpleXMLElement($r);

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


是的,不,实际上我认为这是一个错误.PHP自动注册当前上下文的名称空间.这甚至会覆盖您自己注册的命名空间.您的源基于您加载的文档中使用的前缀.您无法控制的外部来源.前缀是可选的,不明确的,可以随时更改.命名空间是定义的,唯一且稳定的 - 前缀/别名不是.

2> mcrumley..:

您必须为您使用的每个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.



3> ewwink..:

这里替代方案对我有用.

$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;
}



4> Cameron..:

用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();


对我来说最好的答案.简单有效!

5> Asad Saeedud..:

另一种方法是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;
}

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有