【问题标题】:PHP - XML get childrens by name valuePHP - XML 按名称值获取子项
【发布时间】:2013-11-12 11:18:18
【问题描述】:

我有这个从 XML 获取值并创建多维数组的函数。

function esummary_query($db, $id) { 
    $context = stream_context_create(array(
      'http'=>array(
        'user_agent' => 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'
       )
    ));

    $xml = file_get_contents('http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=' . $db . '&id=' . $id, FALSE, $context);

    $xml_file = simplexml_load_string($xml);
    $results2 = array();
      $c=0;
    foreach ( $xml_file->DocSum as $items ) {
        $results2[$c]['id'] = $items->Id;
        $authors = $xml_file->xpath("//Item[@Name='Author']");
        foreach ($authors as $author) {
            $results2[$c]['authors'][] = $author;
        }
          $c++;
    }
    return $results2;
}

但这会在每次读取 DocSum 时获取所有名称为“Author”的项目。我知道会发生这种情况,因为我选择 name="authors" 的所有项目,但如果我把 $xml_file->xpath("/Item[@Name='Author']") 或 $items->xpath( "/Item[@Name='Author']") 它不起作用。

这是XML

我该怎么做?

谢谢!

【问题讨论】:

  • "//Item[@Name='Author'] => 在文档中的任何地方 find ... "/Item[@Name='Author']" => 从根元素中找到子元素命名为“Item”的元素,它有一个名为“Name”的属性,其值为“Author”。“Item[@Name='Author']”=> 从我的 CURRENT 节点中,找到子节点....
  • 正如您已经猜到的那样,您的 XPath 语句必须更具选择性。但是,我们无法知道您要选择哪个Item,除非您至少向我们提供您正在解析的 XML 的草图。您使用的 URL 仅适用于已知 ID。
  • 我在问题中添加了一个 XML 的链接

标签: php xml xpath multidimensional-array


【解决方案1】:

//DocSum/Id[text()="24214944"]/..//Item[@Name="Author"] 返回以 24214944 作为 id 的 DocSum 的作者列表。从中扩展,您可以动态构建 xpath 查询:

$results2[$c]['id'] = $items->Id;
$authors = $xml_file->xpath('//DocSum/Id[text()="' . $items->Id . '"]/..//Item[@Name="Author"]');
foreach ($authors as $author) {
    $results2[$c]['authors'][] = $author;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多