Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I have this 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>

And i would like to create an array like this:

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

I have do this function to get data from XML to PHP in which i am trying to put the data with this structure and then display. I have not much experience with PHP i am having problems with syntax. This is the function:

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'];

But when i display it, the id is shown but the author's names don't. print_r display:

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 ) ) ) )

Thanks everybody!

share|improve this question
    
Every time you do $results2[] you add a new element to $results2... –  Passerby Nov 12 '13 at 9:14
    
i try puting $results2[$i]['authors'][] = $author; but it not seem to work. –  Genethic Nov 12 '13 at 9:25

2 Answers 2

up vote 0 down vote accepted

Add counter and use it as array key

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;
}

example output

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
                )

        )

)
share|improve this answer

You can also try to use DOMDocument, has a steeper learning curve but once you get the hang of it it provides more flexibility than 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,
    );
}

And the output is what you need:

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)
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.