Разобрать XML и объединить разделенные URL с помощью SimpleXML и XPath - PullRequest
1 голос
/ 28 февраля 2012

Мне нужна помощь, я бы хотел, чтобы вы мне помогли;) Я призываю некоторых гуру в поисках мира и знаний, хе-хе. Хорошо. Позвольте мне объяснить, у меня есть XML, и у него есть раздел, где URL сегментируется, как показано ниже. Я могу успешно разобрать его с помощью SimpleXML и XPath. Мои запросы 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: echo $ protocol [0], $ url [0], $ filename [0], $ ext [0], и я хочу сделать это проще с меньшим количеством переменные как в completeURL [0] [0] [0] [0] (первый файловый узел со всеми соответствующими частями), completeURL [1] [1] [1] [1] (второй файловый узел со всеми частями URL) и т.д ...

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

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Это можно сделать намного проще и (почти) полностью в 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 голосов
/ 07 марта 2012

Если сделано следующим образом:

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

Команда echo печатает это:

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

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

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

...