2010-01-28 3 views
1

J'ai les deux erreurs suivantes lors de l'utilisation de XMLReader.Deux erreurs lors de l'utilisation de PHP XMLreader

1) Attention: XMLReader :: read() [xmlreader.read]: MyXML.xml: 43102: erreur analyseur: xmlParseEntityRef: pas de nom

2) Attention: XMLReader :: read() [xmlreader. read]:^dans MyXMLReader.php sur la ligne 56

Est-ce que quelqu'un sait à quoi cela fait référence?

code PHP Mon (Le fichier XML est d'environ 100 Mo, donc je ne peux pas l'inclure):

<?php 

//Assign file names 
$XMLFile = 'MyXML.xml'; 
$CSVFile = 'MyCSV.csv'; 

//take start time to calculate run-time 
$time_start = time(); 

//Open PHP's XMLReader. XMLReader opens each element in the XML one by one to keep memory use small. 
$xml = new XMLReader(); 
$xml->open($XMLFile, null, 1<<19); 

//Loop through all elements. Save all text from tags and attributes. 
while ($xml->read()) { 

    if($xml->nodeType == XMLReader::TEXT) { 
     $row[$xml->name] = $xml->value; 
    } 

    if($xml->hasAttributes) { 
     while($xml->moveToNextAttribute()) { 
      $row[$xml->name] = $xml->value; 
     } 
    } 
} 

//save the titles which should appear in CSV file. All others will not be included. 
$SavedRows = $row; 
unset($row); 

//Remove unnecessary columns i.e. datasource URLs 
$RemoveColumn='xmlns:message, xmlns:common, xmlns:frb, xmlns:xsi, xsi:schemaLocation, xmlns:kf'; 
$RemoveColumns = explode(',', $RemoveColumn); 

foreach($RemoveColumns as $key => $val) { 
    $val = trim($val); 
    unset($SavedRows[$val]); 
} 

//initiate all rows which should be included 
foreach($SavedRows as $key => $val) { 
    $row[$key] = ''; 
} 

//Create csv file 
$fp = fopen($CSVFile, 'w'); 

//Input the column headings as first row 
fputcsv($fp, array_keys($row), ','); 

// Start 2nd loop through XML. 
$xml = new XMLReader(); 
$xml->open($XMLFile, null, 1<<19); 

while ($xml->read()) { 

    //Determine if tag is empty (An empty tag will contain data) Non empty tags contain series information. 
    $Output = $xml->isEmptyElement; 

    //Take data from non empty XML tags 
    if($xml->nodeType == XMLReader::TEXT) { 
     if(isset($SavedRows[$xml->name])) { 
      $row[$xml->name] = $xml->value; 
     } 
    } 

    //take data from XML tag attributes 
    if($xml->hasAttributes) { 
     while($xml->moveToNextAttribute()) { 
      if(isset($SavedRows[$xml->name])) { 
       $row[$xml->name] = $xml->value; 
      } 
     } 
    } 

    //If tag is empty, assume it is data and write row to file. 
    if($Output) { 
     fputcsv($fp, array_values($row), ','); 
    } 

} 

//Close file handle 
fclose($fp); 

//Calculate runtime 
$time_end = time(); 
$time = $time_end - $time_start; 

echo "Complete. Runtime: $time seconds"; 

?> 
+0

Pouvez-vous coller votre code php et document XML que vous utilisez? – Trevor

Répondre

4
xmlParseEntityRef: no name 

signifie que vous avez esperluette unescaped dans le faux fichier XML. (Eh bien, "XML" ... techniquement, si ce n'est pas bien formé, ce n'est pas XML.)

Vous devrez vérifier le fichier & s (ou corriger le code qui l'a généré) pour leur échapper à &amp;. Selon l'erreur, le premier est sur la ligne 43102 du fichier (yikes!).

+0

Existe-t-il un moyen de leur échapper dans la boucle 'while ($ xml-> read())'? – Brian

+0

Non. Si vous avez '&' en dehors d'une référence d'entité/caractère, ce n'est pas XML et XMLReader ne le touchera pas. Comme une solution de contournement à court terme, vous pouvez essayer de «réparer» le fichier avec un hack regex méchant sur le contenu du fichier avant de laisser un analyseur XML à elle; voir http://stackoverflow.com/questions/2049400/php-domdocument-loadxml-with-xml-containing-ampersand-less-greater/2049526#2049526 pour un exemple. Cependant, ceci n'est pas étanche (cela peut gâcher le contenu du commentaire/PI/CDATA-section); Ce n'est pas une solution durable. Le programme défectueux qui a généré le non XML doit être corrigé. – bobince

+0

Je réparerais le XML si je le produisais. Malheureusement, cela vient d'une agence gouvernementale. C'est plutôt mauvais qu'ils utilisent une syntaxe illégale. – Brian