我正在尝试解析Archive.org搜索功能中的数据。数据如下所示:
<doc>
<float name="avg_rating">5.0</float>
<arr name="collection"><str>U-Melt</str><str>etree</str></arr>
<arr name="format"><str>Checksums</str><str>Flac</str><str>Flac FingerPrint</str>
<str>Metadata</str><str>Ogg Vorbis</str><str>Text</str><str>VBR M3U</str>
<str>VBR MP3</str><str>VBR ZIP</str></arr>
<str name="identifier">umelt2009-09-19.main.km184.flac16</str>
<str name="mediatype">etree</str>
<int name="num_reviews">1</int>
</doc>
PHP的SimpleXML可以很好地获取每个文档,并且可以读取标记为str和arr的项目。这是标记为float,int或long的项目,它会吓坏我,我无法弄清楚原因。
我的解析代码如下:
/* OPENING FILE */
$xml = simplexml_load_file($pathname.$identifier_list);
//Check the file to make sure it's got XML in it
$xmlCheck = file_get_contents($pathname.$identifier_list);
$xmlCheck = substr($xmlCheck,0,4);
if (!$xmlCheck == "<?xm") {
die("<p>WARNING: ".$filename." doesn't looks like XML, quitting. Check it to see what's wrong.");
}
else {
$result = $xml->result;
echo "<br/><br/>".$result['name']."<br/>";
$counter = 1;
foreach ($result->doc as $doc) {
echo "<br/><b>Document ".$counter."</b>";
$counter++;
foreach ($doc->children() as $item) {
echo $item->getName();
switch ((string) $item['name']) {
case 'identifier':
echo "<br/>Identifier: ".$item."\n";
break;
case 'licenseurl':
echo "<br/>License URL: ".$item."\n";
break;
case 'mediatype':
echo "<br/>Mediatype: ".$item."\n";
break;
case 'downloads':
echo "<br/>Downloads: ".$item."\n";
break;
case 'avg_rating':
echo "<br/>Average Rating: ".$item."\n";
break;
case 'collection':
echo "<br/>Collection: ".$item."\n";
break;
}
}
echo "<br/>";
}
}
我尝试过使用 - &gt; children(), - &gt; doc和 - &gt; long或 - &gt; int。这些似乎都没有拿起long / int / float项。我开始认为这是因为它们是原始的,但我不知道如何解决这个问题。
提前感谢您的帮助。
答案 0 :(得分:1)
看一下那个XML数据(你链接到的search.xml),我似乎没有问题。
例如,如果我这样做:
$xml = simplexml_load_file('search.xml');
foreach ($xml->result->doc as $doc) {
var_dump($doc);
}
我有几个输出,每个都看起来像这样:
object(SimpleXMLElement)[3]
public 'float' => string '0.0' (length=3)
public 'arr' =>
array
0 =>
object(SimpleXMLElement)[5]
public '@attributes' =>
array
'name' => string 'collection' (length=10)
public 'str' =>
array
0 => string 'sijis' (length=5)
1 => string 'netlabels' (length=9)
2 => string 'netlabels' (length=9)
1 =>
object(SimpleXMLElement)[6]
public '@attributes' =>
array
'name' => string 'format' (length=6)
public 'str' =>
array
0 => string '256Kbps MP3' (length=11)
1 => string 'Text' (length=4)
public 'long' => string '4721' (length=4)
public 'str' =>
array
0 => string 'sijis_SI8' (length=9)
1 => string 'http://creativecommons.org/licenses/by-nc-sa/2.0/' (length=49)
2 => string 'audio' (length=5)
public 'int' => string '0' (length=1)
(我正在使用Xdebug,它给了我很好的var_dump
s)
这表明“int
”,“long
”和等效项是循环中使用的$doc
的直接子项;这意味着你可以使用这样的东西:
$xml = simplexml_load_file('search.xml');
foreach ($xml->result->doc as $doc) {
echo $doc->long . ' ; ' . $doc->float . '<br />';
}
要获取“long
”和“float
”数据;对于第一批文件,它给出了那种输出:
4721 ; 0.0
;
2206 ; 0.0
1239 ; 3.5
这对你有帮助吗?
实际上,你的代码对我来说似乎很合适;如果我删除“echo $item->getName();
”行,为了获得更清晰的输出,我得到第一份文件:
Document 1
Average Rating: 0.0
Collection:
Downloads: 4721
Identifier: sijis_SI8
License URL: http://creativecommons.org/licenses/by-nc-sa/2.0/
Mediatype: audio
在查看XML时看起来没问题?
例如,下载次数似乎没问题?
答案 1 :(得分:0)
咳咳。因此,我正在阅读的XML似乎不是一个足够大的样本大小来包含我正在寻找的数据。如果我增加行数,则会显示数据并且我的代码正常。
所以,对我的代码工作而言,嘘我是个白痴,而且不能早点弄明白。
感谢您的帮助。