【问题标题】:SimpleXML, associative arrays, and XPathSimpleXML、关联数组和 XPath
【发布时间】:2009-07-20 14:11:57
【问题描述】:

我有一个关于 xpath 和数组的问题。我想知道是否可以在一些 simpleXML 上使用 xpath 并让它返回节点名称及其值的关联数组。例如,假设我有以下 XML:

<element1 page="1">blah</element1>
<element2 page="1">blah blah</element2>
<element3 page="2">blah</element3>
<element4 page="3">blah blah</element4>

现在,如果我要去$xml-&gt;xpath('//node()[@page="1"]');,那么它将返回一个如下所示的数组:

array( 0 => 'blah' , 1 => 'blah blah' );

是否有可能得到一个类似于下面的数组?

array( element1 => 'blah' , element2 => 'blah blah' );

感谢您的帮助!

【问题讨论】:

    标签: php xpath simplexml associative-array


    【解决方案1】:

    我不认为您可以将其提取到那种数组中(您需要告诉 PHP 放置哪些标签、子节点、属性等),但是您可以使用 DOMXPath class 提取 DOMNode 元素,这给了你一个DOMNodeList 对象:

    $document = new DOMDocument();
    $document->load($myXmlFile);
    $xpath = new DOMXPath($document);
    
    $result = $xpath->query('//node()[@page="1"]');
    var_dump($result->length); // int(2)
    var_dump($result->item(0)->tagName); // string(8) "element1"
    var_dump($result->item(1)->tagName); // string(8) "element2"
    

    【讨论】:

      【解决方案2】:

      对于简单的 XML,数组并不完全像您提到的那样:

      $result = array( 0 => simplexmlObject('blah') , 1 => simplexmlObject('blah blah') );
      

      因为您有一个 SimpleXML 对象而不是文字字符串,所以您仍然可以访问完整的 SimpleXML 文档:

      $result[0]->addChild("another", "child");
      
      // which is <element1 page="1">blah<another>child</another></element1>
      

      或更接近您的问题

      $name = $result[0]->getName();
      

      如果您对 DOM 属性可以做的所有事情着迷,那么您可以执行以下操作:

      $parent = dom_import_simplexml($result[0])->parent; 
      

      【讨论】:

      • 谢谢你;我宁愿循环使用$result[0]-&gt;getName() 自己生成所需的数组,而不是按照其他建议重构我的依赖项。
      猜你喜欢
      • 2013-11-11
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多