2013-01-23 38 views
0

最近我從here得到了關於如何使用PHP中的XMLReader和SimpleXML解析大型XML文件。我想上面提到的教程的代碼應用到我的PHP程序是這樣的:在PHP中使用XMLReader + SimpleXML解析XML

$xml_url = "http://localhost/rest/server.php?wstoken=".$token&function=contents"; 
    $reader = new XMLReader; 
    $reader->open($xml_url); 

    while($reader->read()){ 
     if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SINGLE'){ 
      $doc = new DOMDocument('1.0','UTF-8'); 
      $xml = simplexml_import_dom($doc->importNode($reader->expand(), true)); 
      //$titleString = (string) $xml->description; 
      echo $xml->description; 
     } 
    } 

通過URL調用的XML文件是這樣(XML版本是here): screenshot

其他單標籤(標有'紅色')具有相同的結構,我也想打印他們的'描述'。

上面提到的php程序的輸出是:第1行第1列的錯誤:文檔結尾處的額外內容。任何幫助都會很棒。

+0

難道你不能簡單地使用'simplexml_load_file'和xpath? – Passerby

回答

1

SimpleXML功能應該是足夠了:

$xml=simplexml_load_file('http://dl.dropbox.com/u/72519118/response.xml'); 
var_dump($xml->xpath('//SINGLE/KEY[@name="description"]/VALUE/text()')); 

以上var_dump輸出:

array(3) { 
    [0]=> 
    object(SimpleXMLElement)#2 (1) { 
    [0]=> 
    string(1703) "<div class="no-overflow">..." 
    } 
    [1]=> 
    object(SimpleXMLElement)#3 (1) { 
    [0]=> 
    string(9906) "<div class="no-overflow">..." 
    } 
    [2]=> 
    object(SimpleXMLElement)#4 (1) { 
    [0]=> 
    string(4114) "<div class="no-overflow">..." 
    } 
} 

注意在xpath()該標籤名稱是區分大小寫的,所以'//single/key...'不起作用。

加成

「標準」 的方法來檢索SimpleXML中的文本價值$KEY->VALUE;

不過,如果你已經達到了XML樹的「結束」節點(就像我在我的XPath做),你可以簡單地把它類型轉換爲字符串來獲取值:

$xml=simplexml_load_file('http://dl.dropbox.com/u/72519118/response.xml'); 
$result=$xml->xpath('//SINGLE/KEY[@name="description"]/VALUE/text()'); 
foreach($result as $text) 
{ 
    var_dump((string)$text); 
} 

以上輸出:

string(1703) "<div class="no-overflow"><p>..." 
string(9906) "<div class="no-overflow"><h3>..." 
string(4114) "<div class="no-overflow"><h3>..." 
+0

感謝您的回覆,我用它,但現在的結果是:第1行第1列出現錯誤:文檔爲空 – Dozent

+0

@Dozent我再次嘗試此代碼,仍然得到相同的結果。你確定你的'server.php'生成了與你在DropBox上發佈的相同的有效XML嗎? – Passerby

+0

是的,現在它的工作,我錯誤地把內容類型:應用程序/ XML而不是文本/ HTML。其結果是現在: 陣列(15){ [0] => 對象(的SimpleXMLElement)#2(0){ } [1] => 對象(的SimpleXMLElement)#3(0){ } [2] => 對象(SimpleXMLElement)#4(0){ ... 老實說,我不知道如何從這組數組中提取數值。你能告訴我方法嗎?謝謝 – Dozent