2012-11-04 38 views
0

最近几天,我正在更新脚本以使用Joomla 2.5。这几乎完成了,但有一件事我还没有解决。这是一个奇怪的。xml_parse退出页面。没有错误

该脚本有一个cron解析会员XML。要做到这一点,使用PHP函数xml_parse,如下图所示:

if (!($fp = @$file_function($url, 'rb'))) { 
    $this->error("Cannot open {$url}"); 
    return; 
} 

while (($data = fread($fp, 8192))) { 
    if (defined ('LIBXML_BUG')) { 
    # fix voor LIBXML BUG 
    $data=str_replace("&","XMLLIBHACK",$data); 
    } 
    if (!xml_parse($this->parser, $data, feof($fp))) { 

        printf('XML error in %s at line %d column %d', 
      $url, 
        xml_get_current_line_number($this->parser), 
        xml_get_current_column_number($this->parser)); 
      unset ($this->items); 
    } 
} 
xml_parser_free($this->parser); 

正如所说的xml_parse函数问题的规定。在这一行上,整个页面/脚本停止工作,并只返回写在该行上面的内容。当error_reporting为E_ALL且display_errors为On时,它不返回任何错误。当故意创建错误时,我看到error_reporting正在工作的错误。解析器($ this-> parser)是在另一个文件中创建的。 Wich被加载(var_dumped $ this-> parser)。

在其中创建$这个 - >解析器的代码(我相信这个类的magpierss叫):

function create_parser($out_enc, $in_enc, $detect) { 
     if (substr(phpversion(),0,1) == 5) { 
      $parser = $this->php5_create_parser($in_enc, $detect); 
     } 
     else { 
      $parser = $this->php4_create_parser($in_enc, $detect); 
     } 
     if ($out_enc) { 
      $this->encoding = $out_enc; 
      xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $out_enc); 
     } 

     return $parser; 
    } 

    /** 
    * Instantiate an XML parser under PHP5 
    * 
    * PHP5 will do a fine job of detecting input encoding 
    * if passed an empty string as the encoding. 
    * 
    * All hail libxml2! 
    * 
    */ 
    function php5_create_parser($in_enc, $detect) { 
     // by default php5 does a fine job of detecting input encodings 
     if(!$detect && $in_enc) { 
      return xml_parser_create($in_enc); 
     } 
     else { 
      return xml_parser_create(''); 
     } 
    } 

    /** 
    * Instaniate an XML parser under PHP4 
    * 
    * Unfortunately PHP4's support for character encodings 
    * and especially XML and character encodings sucks. As 
    * force to UTF-8 use admin settings to change this 
    */ 
    function php4_create_parser($in_enc, $detect) { 
     if ($detect) { 
      $in_enc = 'UTF-8'; 
     } 

     return xml_parser_create($in_enc); 

    } 

我的想法来解决这个问题。我尝试了不同的编码(ISO,UTF-8等),检查$数据,但一切似乎文件。

一个例子XML文件可以在这里找到:http://pastebin.com/wT1pVZLQ

+0

我试过你的脚本(使用提供的数据),也没有打破我。我在'xml_parser_free($ this-> parser)之后执行了一些代码行;'它工作正常。你能否寄全班,以便详细了解? –

+0

你在哪里设置了错误报告设置?在代码中,或在php.ini? – jprofitt

+0

Error_reporting和显示错误是在php.ini中设置的,我在代码本身尝试了它,但这并没有帮助。 – Timo

回答

2

我会建议你使用更灵活的SimpleXMLElement ..所有你需要做的只是循环获取你想要的元素。

示例使用您的XML

header('Content-Type: text/html; charset=utf-8'); 
$sxe = simplexml_load_file("log.xml", "SimpleXMLElement"); 

echo "<pre>"; 
foreach ($sxe->dataHeader as $element) { 
    foreach ($element as $key => $value) 
     echo $key, " = ", $value, PHP_EOL; 
} 

echo PHP_EOL; 
foreach ($sxe->data as $record) { 
    foreach ($record as $key => $element) { 
     foreach ($element as $key => $value) 
      echo $key, " = ", $value, PHP_EOL; 
    } 
} 

输出

exportType = stream 
exportId = 256106 
rows = 1 
lastChecked = 2012-11-04 14:03:06.26 
lastUpdated = 2012-11-04 00:03:02.822 
parserLocale = nl_NL 
streamCurrency = EUR 
name = befit2day.nl 
description = 


recordHash = 1124208770 
url = http://clicks.m4n.nl/_c?aid=14375&adid=695437&_df=true&turl=http%3A%2F%2Fbefit2day.nl%2F 
title = Universeel krachtstation 
description = Géén verzendkosten Verwachte levertijd 5 werkdagen Universeel krachtstation In hoogte verstelbare haltersteunen Rugleuning in 6 standen te verstellen Biceps curl steun in 3 standen te verstellen Been curl in 3 standen te verstellen (te belasten tot 60 kg) Geschikt voor halterschijven met stang opening van 20 - 31 mm Ook te gebruiken voor weighted crunches (met behulp van de kabel), tot 60 kg Ook te gebruiken voor dips Maximaal belastbaar tot 280 kg (inclusief gebruikersgewicht) Bankdrukken tot 180 kg Totaal gewicht 40 kg Geleverd exclusief halterstangen en gewichten Afmetingen krachtstation (L x B x H): 180 cm x 106 cm x 90-110 cm Afmetingen rugleuning (L x B x H): 68 cm x 28 cm x 4 cm Afmetingen curl steun (L x B x H): 28 cm x 44,5 cm x 4 cm Met aan de onderzijde gummi bekleding voor bescherming van de vloer 
offerid = 
image = http://befit2day.nl/img/products/11749/103/universeel-krachtstation.jpg 
price = 149.90 
category = dagaanbieding 
subcategory = 
stock = 1 
timetoship = 
ean = 
price_shipping = 0.00 
price_old = 299.90 
vendor = 
category_path = 
publisher = befit2day.nl 
column0 = dagaanbieding 
time = 0:00 
logo = http://befit2day.nl/themes/store_4/images/logo.jpg 
merchantID = 20420 
+0

谢谢。它的工作现在! – Timo

+0

不客气... – Baba

1

检查你的日志,看看有什么解析器是投掷,和/或尝试的ini_set(“display_errors设置”,1);

您可能正在获取文件中与您尝试的编码不兼容的字符,或者它无法识别xml文件是否被正确格式化。

如果是编码问题,请首先替换字符(如果它只有一两个字符),然后将其解析为xml,或者找到完全支持xml文件的编码。

1
tail -f /var/log/apache2/error.log 

刷新网站并观察“分段错误”。这通常是万事万物停止响应的情况。

+0

错误日志不显示任何分段错误或任何错误。它看起来像PHP只是停止执行文件... – Timo

+0

恐怕PHP不会停止,但只是崩溃,因此没有错误。你使用什么版本的PHP? –

+0

PHP版本5.2。17 – Timo

相关问题