2012-02-28 2 views
1

Мне нужна помощь, я хочу, чтобы вы могли мне помочь;) Я призываю некоторых гуру в поисках мира и знаний хе-хе. OK Позвольте мне объяснить, у меня есть XML, и у него есть раздел, где он сегментирован, как показано ниже. Я могу успешно проанализировать его с помощью SimpleXML и XPath. Мои запросы XPath возвращают мне массив с результатами, а затем я могу повторить их. Нет проблем! =)Анализ XML и конкатенация разделенного URL с SimpleXML и XPath

Однако я хочу сделать это еще дальше, пытаясь сократить количество строк кода и улучшить код. Во-первых, посмотрите на мой код, вы можете копировать/вставить его и дать ему попробовать:

<?php 

$xml_g=' 
<files> 
    <file> 
     <filename>itzafile</filename> 
     <ext>.tar.gz</ext> 
     <url protocol="http://">itzanexample.net/folder/subfolder/</url> 
    </file> 
    <file> 
     <filename>itzavideo</filename> 
     <ext>.mp4</ext> 
     <url protocol="ftp://">itzanotherurl.com/videos/</url> 
    </file> 
</files> 
'; 


function URLparts($xml) { 
$xmlData= simplexml_load_string("$xml"); 

$protocol = $xmlData->xpath('//file/url/@protocol'); 
$url = $xmlData->xpath('//file/url'); 
$filename = $xmlData->xpath('//file/filename'); 
$ext = $xmlData->xpath('//file/ext'); 

echo 'The following it\'s echoed calling 4 different arrays:'."\n\t".$protocol[0], $url[0], $filename[0], $ext[0]."\n\t".$protocol[1], $url[1], $filename[1], $ext[1]."\n\n"; //prints the entire url! Right! 


//These variables are arrays, so theorically it must be possible to create an array of arrays here: 
$completeURL = array($protocol,$url,$filename,$ext); 
//I've also tried this but it's just the same problem: 
//$completeURL = array(array($protocol),array($url),array($filename),array($ext)); 

echo 'The following should be echoed with a two-dimensional array, but something fails:'."\n\t".$completeURL[0][0][0][0]."\n\n"; //Just prints "http://" WRONG! u.u 
/* 
* $completeURL[1][0][0][0] prints the domain+subfolder 
* $completeURL[0][1][0][0] prints ftp:// 
* $completeURL[0][0][1][0] prints nothing... 
*/ 

} 

URLparts($xml_g); 
?> 

Как вы можете видеть, я хочу, чтобы избежать присоединения к URL, как: эхо $ протокола [0], $ URL [0], $ filename [0], $ ext [0], и я хочу сделать это проще с меньшим количеством переменных, чем в completeURL [0] [0] [0] [0] (первый узел файла со всеми его соответствующими частями) , completeURL [1] [1] [1] [1] (второй файловый узел со всеми частями URL) и т. д.

Но, очевидно, я делаю что-то неправильно ... Может кто-нибудь сказать мне, где находится ошибка?? Это должно быть связано с многомерного массива Я пытаюсь создать ...

ответ

0

Если все сделано так:

$completeURL = $xmlData->xpath('//file/url/@protocol | //file/url | //file/filename'); 
echo $completeURL[2].$completeURL[1].$completeURL[0]."\n"; 
echo $completeURL[5].$completeURL[4].$completeURL[3]."\n"; 

эхо команда печатает это:

http://itzanexample.net/folder/subfolder/itzafile.tar.gz 
ftp://itzanotherurl.com/videos/itzavideo.mp4 

Использование оператора накидной | получает предполагаемый результат с помощью PHP5 + SimpleXML + XPath !! ОДНАКО Я не понимаю ПОЧЕМУ результат должен быть отражен назад (2, 1, 0; 5, 4, 3) вместо 0, 1, 2, 3 и т. Д.

Также я не получаю ПОЧЕМУ следующее выражение дает тот же результат, гулкой таким же образом:

$completeURL = $xmlData->xpath('//file/filename | //file/url | //file/url/@protocol'); 

Это также решает вопрос, но остается неизвестным для меня, почему эти 2 выражения возвращают то же самое. Значит, порядок не имеет значения? Почему нужно эхо назад?

Так что это действительно ответ, но его нужно объяснять. Кто-нибудь знает, почему? БЛАГОДАРЯ! =)

+0

Очевидно, что 'echo' выводит строковое значение каждого из узлов в наборе узлов, которое является результатом оценки выражения XPath. Важно знать, что при выполнении '|' результаты всегда отображаются * в порядке документа *. Итак, порядок аргументов '' 'действительно не имеет значения. –

+0

AH Вот в чем причина! «Заказ документа» СПАСИБО Ты мне очень помог =) – Metafaniel

+0

Metafaniel: Я рад, что был полезным. Если это так, вы можете рассмотреть более SO-подобную благодарность (+1 или принять). :) –

1

Это можно сделать гораздо проще, и (почти) полностью в XPath:

concat(/files/file[$k]/url/@protocol, 
      /files/file[$k]/url, 
      /files/file[$k]/filename, 
      /files/file[$k]/ext 
     ) 

$k, где должен быть замещен 1, 2, .., count((/files/file) - в данном случае только на 1 и 2.

таким образом, когда это выражение XPath оценивается:

concat(/files/file[1]/url/@protocol, 
      /files/file[1]/url, 
      /files/file[1]/filename, 
      /files/file[1]/ext 
     ) 

разыскиваемых правильный результат получается:

http://itzanexample.net/folder/subfolder/itzafile.tar.gz 

Когда второе выражение XPath оценивается:

concat(/files/file[2]/url/@protocol, 
      /files/file[2]/url, 
      /files/file[2]/filename, 
      /files/file[2]/ext 
     ) 

снова разыскиваемый, правильный результат получается:

ftp://itzanotherurl.com/videos/itzavideo.mp4 
+0

Спасибо, мне кажется, полезно mmm, но я не уверен, как это сделать в PHP5 =/ – Metafaniel

+0

@Metafaniel: В C# я бы сделал это как 'nav.Evaluate (string.Format (theExpression, k)) ; '. Где 'ExEx''' concat (/ files/file [2]/url/@ protocol,/files/file [{0}]/url,/files/file [{0}]/filename,/files/file [ {0}]/ext) '. В C можно использовать просто 'printf()'. Конечно, есть способ сделать то же самое в PHP. –

+0

Если я попытаюсь использовать concat с XpAth и PHP следующим образом: '$ completeURL = $ xmlData-> xpath (' concat (// file/url/@ protocol, // file/url, // file/filename) ');» Я получаю эти ошибки: 'PHP Примечание: неопределенное смещение: 0' Я нашел другой способ сделать то, что хочу, я отправлю его ниже ... – Metafaniel

Смежные вопросы