Использование SimpleXML для интерпретации выходных данных BLAST XML - проблема с дефисом?Синтаксическая проблема доступа к вложенным объектам? - PullRequest
0 голосов
/ 20 июля 2011

Я пытаюсь использовать SimpleXML для чтения некоторых выводов NCBI BLAST XML, и я могу получить доступ к некоторым выводам, но не к другим его частям.

Вот соответствующая часть XML (некоторые несвязанные сегменты вырезаны для удобства чтения):

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

А вот мой код (примечание: $ qdef и $ qlen получены по-разному, чтобы убедиться, что я не совершил глупую ошибку при установке / использовании переменной $ 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;

Вот вывод:

Query Program: blastn
Query: 
Query Length:

Если я удаляю {''} вокруг Iteration_query-def и Iteration_query-len, он обрабатывает их как целые числа и возвращает ноль для обоих.

Я что-то не так делаю? Я не могу понять, что я делаю по-другому, кроме {''} вещи между битом BlastOutput_program и двумя другими переменными. Если я добавлю {''} материал в BlastOutput_program, тем не менее, он все равно будет работать нормально и даст правильный вывод для этого. Что за сделка?

Обновление : работает с использованием xpath, следующим образом:

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

Но я все же очень хотел бы знать, если это единственный способ сделать это или есть способ сделать это, как я показал выше.

1 Ответ

0 голосов
/ 21 июля 2011

Понял.Друг указал этот сайт , который показал, что я делаю неправильно: мне нужно было указать индекс элементов XML, которые потенциально могут иметь несколько записей.

Например

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