Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-XML按名称值获取子对象_Php_Xml_Xpath_Multidimensional Array - Fatal编程技术网

PHP-XML按名称值获取子对象

PHP-XML按名称值获取子对象,php,xml,xpath,multidimensional-array,Php,Xml,Xpath,Multidimensional Array,我有一个从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

我有一个从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时,都会获取name=“Author”的所有项目。我知道会发生这种情况,因为我正在选择所有名为“authors”的项目,无论它们在哪里,但如果我将$xml_file->xpath(“/Item[@name='Author']”)或$items->xpath(“/Item[@name='Author']”),它将不起作用

这是最新的

我怎么做

谢谢

//DocSum/Id[text()=“24214944”]/..//Item[@Name=“Author”]
返回DocSum的作者列表,该列表的Id为24214944。从中展开可以动态构造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;
}

“//Item[@Name='Author']=>在文档中的任意位置查找…”/Item[@Name='Author']“=>从根元素中查找名为“Item”元素的子元素,该元素具有名为“Name”的属性,该属性的值为“Author”。”Item[@Name='Author']“=>从我的当前节点,查找子节点……正如您已经猜到的那样,XPath语句必须更具选择性。但是,我们无法知道您要选择哪个
,除非您至少为我们提供您正在解析的XML的草图。您使用的URL仅适用于已知id。我在问题中添加了指向XML的链接