【问题标题】:Access the XML attributes of a SimpleXML node访问 SimpleXML 节点的 XML 属性
【发布时间】:2023-03-28 10:10:01
【问题描述】:

我有一个如下的 XML 文件:

<menus>
    <defaultMenu>
        <group>
            <menuItem name="Example one" url="http://www.google.com">
                <menuItem name="Example Two" url="http://www.yahoo.com" />
                <menuItem name="Example Three" url="http://www.bing.com" />
            </menuItem>
        </group>
    </defaultMenu>
</menus>

我想遍历 &lt;menuItem&gt; 标记以收集所有 URL,但没有找到如何访问 SimpleXML 节点的属性。

这是我尝试但没有成功的代码:

$contentXML = simplexml_load_file('file.xml');
$urls = array();

foreach($xml->menus->defaultMenu->group->menuItem as $menuItem) {
    $urls[] = $menuItem->url;
}

但是,这种方法是不对的,因为数组在循环后只能得到空值。那么,如何访问 SimpleXML 节点的 XML 属性呢?

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    要访问 SimpleXML 节点的属性,您必须将节点对象用作数组。示例:

    foreach($contentXML->menus->defaultMenu->group->menuItem as $menuItem) {
        $urls[] = $menuItem["url"];
    }
    

    请参阅 PHP 文档的 basic usage 页面。

    您也可以在节点上使用attributes() 方法,但这很冗长。

    【讨论】:

      【解决方案2】:

      使用children()attributes() 方法:

      foreach($contentXML->menus->defaultMenu->group->menuItem->children() as $menuItem) {
      
          $urls[] = $menuItem->attributes()['url']; // (PHP v >= 5.4)
      
          $attrs = $menuItem->attributes(); // (PHP v < 5.4)
          $urls[] = $attrs['url']; 
      
      }
      

      Doc

      【讨论】:

        【解决方案3】:

        使用xpath 以一种简单的方式选择所有url 属性无需迭代 XML。
        xpath 类似于 XML 的 SQL:

        $xml = simplexml_load_string($x); // assume XML in $x
        
        $urls = $xml->xpath("//*[@url]/@url");
        

        你已经完成了。看到它工作:https://eval.in/159586

        评论:

        xpath-表达式读作:

        • //* 在层次结构中的任何位置,选择任何节点...
        • [@url] 具有属性 url...
        • /@url 并仅返回属性 url

        $urlsSimpleXml-Objects 的数组,如有必要,转换为 string,例如比较时。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 2012-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多