解析XML并将分割后的URL与SimpleXML和XPath连接起来

时间:2012-02-28 16:25:45

标签: php xpath multidimensional-array xml-parsing simplexml

我需要帮助,我希望你能帮助我;) 我召集一些大师寻求和平和知识嘿嘿。 好的,让我解释一下,我有一个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](所有第二个文件节点)网址部分)等......

但显然我做错了什么...... 有人能告诉我错误在哪里?它应该与我尝试创建的多维数组相关...

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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";

echo命令打印出来:

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

使用union运算符|使用PHP5 + SimpleXML + XPath获得预期的结果!! 但是我不明白为什么结果必须向后回显(2,1,0; 5,4,3)而不是0,1,2,3等。

另外我不明白为什么以下表达式以相同的方式回显相同的结果:

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

这也解决了这个问题,但我仍然不知道为什么这两个表达式返回相同。所以订单无关紧要?为什么需要向后回应??

所以这确实是一个答案,但需要加以解释。有人知道为什么??谢谢! =)