当前位置: 首页 > 面试题库 >

如何使用SimpleXML获取具有名称空间的节点的属性?

钱锦
2023-03-14
问题内容

youtube.xml

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007">

    <entry>
        ...
        <yt:duration seconds="1870"/>
        ...
    </entry>

</feed>

update_videos.php

$source = 'youtube.xml';

// load as file
$youtube = new SimpleXMLElement($source, null, true);

foreach($youtube->entry as $item){
    //title works
    echo $item->title;

    //now how to get seconds? My attempt...
    $namespaces = $item->getNameSpaces(true);
    $yt = $item->children($namespaces['yt']);
    $seconds = $yt->duration->attributes();
    echo $seconds['seconds'];
    //but doesn't work :(
}

问题答案:

所以我找到了一种使用xpath的方法,这是最好的方法还是与我的问题代码保持一致的方法?只是出于好奇。

$source = 'youtube.xml';

// load as file
$youtube = new SimpleXMLElement($source, null, true);
$youtube->registerXPathNamespace('yt', 'http://gdata.youtube.com/schemas/2007');

$count = 0;
foreach($youtube->entry as $item){

    //title works
    echo $item->title;

    $attributes = $item->xpath('//yt:duration/@seconds');
    echo $attributes[$count]['seconds'];
    $count++;
}


 类似资料:
  • 问题内容: 我有下一个XML: 如何获得此节点?我试过了 但它返回一个空数组。我该怎么做? 问题答案: 您需要确保XML解析器支持名称空间。 您还应该确保关闭,最好使用try-with-resources。

  • 问题内容: 我有以下XML: 并且正在尝试阅读office:document-meta节点以提取其下面的各种元素(dc:creator,meta:creation-date等)。 如下代码: 给我: 但是如果我尝试使用以下方法读取document-meta元素: 我懂了 我假设SimpleXML试图从$ officeXML中提取一个不存在的节点“文档”,然后减去(不存在的)常量“元”的值,导致强制

  • 问题内容: 我有一个丑陋的XML,上面有很多名称空间,当我尝试通过simpleXML加载它(如果我指示第一个名称空间)时,我会得到一个xml对象,但是后面带有其他名称空间的标记不会使它成为该对象。 如何解析该XML? 我试图用下面的代码解析它 但是$ xml对象仅包含以下内容 问题答案: 我认为您需要注册名称空间并使用XPath进行访问。如下所示的内容应该可以帮助您(我没有设施可以对此进行测试)。

  • 问题内容: 我在访问SimpleXML对象的部分时遇到问题。当我整个对象时,我得到正确的输出,而当我其余对象(嵌套标签)时,我得到正确的输出,但是当我遵循docs和时 ,我得到一个空对象,尽管事实是第一个清楚地表明,存在要输出的属性。 任何人都知道我在这里做错了/如何进行这项工作? 问题答案: 您可以通过在XML节点上调用attribute()函数来获取XML元素的属性。然后,您可以var_dum

  • 问题内容: 当我在下面尝试添加为属性时,我正在创建Atom供稿- 我将此作为输出- 部分被切断。我需要转义- 字符吗?还是他们以其他方式添加此命名空间? 问题答案: 如果要从名称空间/前缀向$ node 添加属性,则无需事先声明名称空间。只需使用addAttribute()的第三个参数为您在第一个参数中使用的前缀提供名称空间uri。 版画 如果不需要属性本身,则可以使用删除它,而保留名称空间声明。

  • 问题内容: 我知道这个问题已经被问了很多遍了,但是我没有得到任何适合我情况的建议,因此我在网上和这里进行搜索,尝试了所有方法,但没有任何效果。我只需要用命名空间cap解析此XML:并且只需要其中的四个条目。 我正在使用simpleXML,并且设置了一个小的简单测试脚本,它非常适合解析常规元素。我无法为自己的狄更斯找到或获得一种使用命名空间解析元素的方法。 这是一个小示例测试脚本,其中包含我正在使用