3

我有这个 XML:

<eSummaryResult>
    <DocSum>
        <Id>11482001</Id>
        <Item Name="PubDate" Type="Date">2001 Jun</Item>
        <Item Name="EPubDate" Type="Date" />
        <Item Name="Source" Type="String">Adverse Drug React Toxicol Rev</Item>
        <Item Name="AuthorList" Type="List">
            <Item Name="Author" Type="String">Mantle D</Item>
            <Item Name="Author" Type="String">Gok MA</Item>
            <Item Name="Author" Type="String">Lennard TW</Item>
        </Item>
        <Item Name="LastAuthor" Type="String">Lennard TW</Item>
        <Item Name="Title" Type="String">Adverse and beneficial effects of plant extracts on skin and skin disorders.</Item>
        <Item Name="Volume" Type="String">20</Item>
        <Item Name="Issue" Type="String">2</Item>
        <Item Name="Pages" Type="String">89-103</Item>
        <Item Name="LangList" Type="List">
            <Item Name="Lang" Type="String">English</Item>
        </Item>
        <Item Name="NlmUniqueID" Type="String">9109474</Item>
        <Item Name="ISSN" Type="String">0964-198X</Item>
        <Item Name="ESSN" Type="String" />
        <Item Name="PubTypeList" Type="List">
            <Item Name="PubType" Type="String">Journal Article</Item>
            <Item Name="PubType" Type="String">Review</Item>
        </Item>
        <Item Name="RecordStatus" Type="String">PubMed - indexed for MEDLINE</Item>
        <Item Name="PubStatus" Type="String">ppublish</Item>
        <Item Name="ArticleIds" Type="List">
            <Item Name="pubmed" Type="String">11482001</Item>
            <Item Name="eid" Type="String">11482001</Item>
            <Item Name="rid" Type="String">11482001</Item>
        </Item>
        <Item Name="History" Type="List">
            <Item Name="pubmed" Type="Date">2001/08/03 10:00</Item>
            <Item Name="medline" Type="Date">2002/01/23 10:01</Item>
            <Item Name="entrez" Type="Date">2001/08/03 10:00</Item>
        </Item>
        <Item Name="References" Type="List" />
        <Item Name="HasAbstract" Type="Integer">1</Item>
        <Item Name="PmcRefCount" Type="Integer">3</Item>
        <Item Name="FullJournalName" Type="String">Adverse drug reactions and toxicological reviews</Item>
        <Item Name="ELocationID" Type="String" />
        <Item Name="SO" Type="String">2001 Jun;20(2):89-103</Item>
    </DocSum>
</eSummaryResult>

我想创建一个这样的数组:

$results2 = array(
    '0' => array(
        'id' => 'xxxxxxxx',
        'authors' => array(
            '0' => 'xxxxxxxxxx',
            '1' => 'xxxxxxxxxx',
            )
    ),
    '1' => array(
        'id' => 'xxxxxxxx',
        'authors' => array(
            '0' => 'xxxxxxxxxx',
            '1' => 'xxxxxxxxxx',
            )
    ),
);

我已经执行此功能以将数据从 XML 获取到 PHP,我试图将数据放入此结构中然后显示。我对 PHP 没有太多经验,我在语法上有问题。这是功能:

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();
    foreach ( $xml_file->DocSum as $items ) {
        $results2[]['id'] = $items->Id;
        $authors = $xml_file->xpath("//Item[@Name='Author']");
        foreach ($authors as $author) {
            $results2[]['authors'][] = $author;
        }
    }
    return $results2;
}


echo'<h3>id:</h3>' . $results2[0]['id'] . "<br> author:" . $results2[0]['authors'];

但是当我显示它时,会显示 ID,但不会显示作者的姓名。print_r 显示:

Array ( [0] => Array ( [id] => SimpleXMLElement Object ( [0] => 11850928 ) ) [1] => Array ( [authors] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => Author [Type] => String ) [0] => LoPresti PJ ) ) ) [2] => Array ( [authors] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => Author [Type] => String ) [0] => Hambrick GW Jr ) ) ) )

谢谢大家!

4

2 回答 2

0

添加计数器并将其用作数组键

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'] = (string)$items->Id;
        $authors = $xml_file->xpath("//Item[@Name='Author']");
        foreach ($authors as $author) {
            $results2[$c]['authors'][] = (string)$author;
        }
        $c++;
    }
    return $results2;
}

示例输出

Array
(
    [0] => Array
        (
            [id] => 11482001
            [authors] => Array
                (
                    [0] => Mantle D
                    [1] => Gok MA
                    [2] => Lennard TW
                    [3] => Mantle D
                    [4] => Gok MA
                    [5] => Lennard TW
                )

        )

    [1] => Array
        (
            [id] => 11482001
            [authors] => Array
                (
                    [0] => Mantle D
                    [1] => Gok MA
                    [2] => Lennard TW
                    [3] => Mantle D
                    [4] => Gok MA
                    [5] => Lennard TW
                )

        )

)
于 2013-11-12T09:26:20.103 回答
0

您也可以尝试使用 DOMDocument,它的学习曲线更陡峭,但一旦掌握了它,它就会比 SimpleXML 提供更多的灵活性。

$result = array();

// pretty output if it's needed        
$xml = new DOMDocument('1.0', 'utf-8');
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;

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

// xpath to use later
$xpath = new DOMXPath($xml);

// get all the nodes that we want to extract data from
$nodes = $xml->getElementsByTagName('DocSum');

foreach ($nodes as $node)
{
    // extract the ID
    $idNode = $node->getElementsByTagName('Id');

    $id = $idNode->item(0)->nodeValue;

    // extract the authors, we need to use xpath
    $query = '//Item[@Name="AuthorList"]/Item[@Name="Author"]';
    $authorNodes = $xpath->query($query, $node);

    $authors = array();
    foreach ($authorNodes as $authorNode)
    {
        $authors[] = $authorNode->nodeValue;
    }

    // add the found details to the result array
    $result[] = array(
        'id'      => $id,
        'authors' => $authors,
    );
}

输出就是你需要的:

array
  0 => 
    array
      'id' => string '11482001' (length=8)
      'authors' => 
        array
          0 => string 'Mantle D' (length=8)
          1 => string 'Gok MA' (length=6)
          2 => string 'Lennard TW' (length=10)
于 2013-11-12T09:44:52.580 回答