I'm trying to use SimpleXML to read some NCBI BLAST XML output, and I'm able to access some of the output, but not other bits of it.
Here's the relevant part of the XML (some unrelated segments excised for readability):
<?xml version="1.0"?> <!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "NCBI_BlastOutput.dtd">
<BlastOutput>
<BlastOutput_program>blastn</BlastOutput_program>
<BlastOutput_db>allconstructs.fasta</BlastOutput_db>
<BlastOutput_iterations>
<Iteration>
<Iteration_iter-num>1</Iteration_iter-num>
<Iteration_query-ID>Query_1</Iteration_query-ID>
<Iteration_query-def>gene_1_query</Iteration_query-def>
<Iteration_query-len>1005</Iteration_query-len>
And here's my code (note: $qdef and $qlen are arrived at differently to make sure I hadn't made some stupid mistake in setting/using the $output variable):
$blast = simplexml_load_string($xml);
$output = $xml->BlastOutput_iterations->Iteration;
$qprog = $blast->BlastOutput_program;
$qdef = $xml->BlastOutput_iterations->Iteration->{'Iteration_query-def'};
$qlen = $output->{'Iteration_query-len'};
echo "Query Program: ".$qprog."<br/>Query: ".$qdef."<br/>Query Length: " .$qlen;
Here's the output:
Query Program: blastn
Query:
Query Length:
If I remove the {''} around Iteration_query-def and Iteration_query-len, it treats them as integers and returns zero for both.
Am I doing something wrong? I can't figure out anything I'm doing differently other than the {''} stuff between the BlastOutput_program bit and the two other variables. If I add the {''} stuff to BlastOutput_program, though, it still works fine and produces correct output for that. What's the deal?
Update: It works using xpath, as follows:
$qlen = $blast->xpath('BlastOutput_iterations/Iteration/Iteration_query-def');
But I'd still really like to know if that's the only way of doing it or if there's a way to do it like I've shown above.
Got it. A friend pointed out this site, which showed what I was doing wrong: I needed to specify the index of the XML elements that potentially had multiple entries.
E.g.
$firstHit = $xml->BlastOutput_iterations->Iteration[0]->Iteration_hits->Hit[0];