/ / Używanie SimpleXML do interpretowania wyjścia XML BLAST - problem z łącznikiem? Zagadnienie składni zagnieżdżonych obiektów? - xml, simplexml, blast, ncbi

Używanie SimpleXML do interpretowania wyjścia XML BLAST - problem z łącznikiem? Problem z składnią dostępu do obiektu zagnieżdżonego? - xml, simplexml, blast, ncbi

Próbuję użyć SimpleXML do odczytu niektórych wyników NCBI BLAST XML i jestem w stanie uzyskać dostęp do niektórych danych wyjściowych, ale nie do innych bitów.

Oto odpowiednia część XML (niektóre niepowiązane segmenty wycięte dla czytelności):

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

A oto mój kod (uwaga: $ qdef i $ qlen są dostarczane w różny sposób, aby upewnić się, że nie popełniłem jakiegoś głupiego błędu przy ustawianiu / używaniu zmiennej $ output):

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

Oto wynik:

Query Program: blastn
Query:
Query Length:

Jeśli usuniemy {""} wokół Iteracja_query-def i Iteration_query-len, traktuje je jako liczby całkowite i zwraca zero dla obu.

czy robię coś źle? Nie mogę wymyślić niczego, co robię inaczej niż {"} rzeczy między bitem BlastOutput_program i dwiema innymi zmiennymi. Jeśli jednak dodaję {""} rzeczy do BlastOutput_program, to nadal działa dobrze i generuje poprawne dane wyjściowe. O co chodzi?

Aktualizacja: Działa za pomocą xpath, jak następuje:

$qlen = $blast->xpath("BlastOutput_iterations/Iteration/Iteration_query-def");

Ale nadal chciałbym wiedzieć, czy to jedyny sposób, aby to zrobić, czy też jest sposób, aby to zrobić, jak to pokazano powyżej.

Odpowiedzi:

0 dla odpowiedzi № 1

Rozumiem. Przyjaciel wskazał ta strona, która pokazała, co robiłem źle: musiałem określić indeks elementów XML, które potencjalnie miały wiele wpisów.

Na przykład.

$firstHit = $xml->BlastOutput_iterations->Iteration[0]->Iteration_hits->Hit[0];