2011-12-15 13 views
6

sto ottenendo questo errore durante l'esecuzione di questo codice: Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in test.php:29 Stack trace: #0 test.php(29): DOMDocument->createElement('1OhmStable', 'a') #1 {main} thrown in test.php on line 29 PHP errore di carattere non valido

I nodi che dal file XML originale contengono caratteri non validi, ma come sto stripping i caratteri non validi lontano dai nodi, i nodi dovrebbero essere creati. Che tipo di codifica devo fare sul documento XML originale? Devo decodificare il saveXML?

function __cleanData($c) 
{ 
    return preg_replace("/[^A-Za-z0-9]/", "",$c); 
} 
$xml = new DOMDocument('1.0', 'UTF-8'); 
$xml->load('test.xml');  
$xml->formatOutput = true; 

$append = array(); 
foreach ($xml->getElementsByTagName('product') as $product) 
    { 
     foreach($product->getElementsByTagName('name') as $name) 
     { 

      $append[] = $name; 
     } 
       foreach ($append as $a) 
       { 
        $nodeName = __cleanData($a->textContent); 

         $element = $xml->createElement(htmlentities($nodeName) , 'a'); 
       } 
     $product->removeChild($xml->getElementsByTagName('details')->item(0)); 
     $product->appendChild($element); 
    } 

$result = $xml->saveXML(); 
$file = "data.xml"; 
file_put_contents($file,$result); 

Questo è ciò che l'XML originale assomiglia:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?> 
<products> 
<product> 
<modelNumber>M100</modelNumber> 
<itemId>1553725</itemId> 
<details> 
    <detail> 
    <name>1 Ohm Stable</name> 
    <value>600 x 1</value> 
    </detail> 
</details> 
</product> 
</products> 

si suppone che il nuovo documento per assomigliare a questo:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?> 
<products> 
<product> 
<modelNumber>M100</modelNumber> 
<itemId>1553725</itemId> 
    <1 Ohm Stable> 

    </1 Ohm Stable> 

    </product> 
</products> 
+0

sei come parlare a te stesso, dov'è l'XML? – ajreal

+0

@ajreal Basta metterlo su –

+1

Perché pubblichi la versione pulita? – ajreal

risposta

10

Semplicemente non è possibile utilizzare un nome di elemento iniziare con il numero

1OhmStable <-- rename this 
_1OhmStable <-- this is fine 

php parse xml - error: StartTag: invalid element name

un bell'articolo: - http://www.xml.com/pub/a/2001/07/25/namingparts.html

un nome è un inizio token con una lettera o una di alcuni caratteri di punteggiatura e continua con lettere, cifre, trattini, caratteri di sottolineatura, due punti o punti fermi, insieme denominati caratteri di nome.

0

Assicurarsi script hanno stessa codifica: se è UTF assicurarsi che siano privi di Byte Order Mark (BOM) all'inizio del file. Per farlo aprire il file XML con un editor di testo come Notepad ++ e convertire il file in "UTF-8 senza BOM".

ho avuto un errore simile, ma con una json file

5

Non hanno scritto in cui si ottiene questo errore. Nel caso è dopo aver ripulito il valore, questo è la mia ipotesi:

preg_replace("/[^A-Za-z0-9]/", "",$c); 

Questa sostituzione non è scritto per le stringhe UTF-8 codificati (che vengono utilizzati da DOMDocument). Si può rendere UTF-8 compatibile utilizzando la u-modifier (PCRE8)­Docs:

preg_replace("/[^A-Za-z0-9]/u", "",$c); 
          ^

E 'solo una supposizione, vi suggerisco di fare più precisa nella sua domanda, che parte del codice genera l'errore.

1

Anche se __cleandata() rimuoverà tutti gli altri caratteri rispetto agli alfabeti latini a-z e ai numeri, non garantisce necessariamente che il risultato sia un nome XML valido. La tua funzione può restituire stringhe che iniziano con un numero, ma i numeri sono illegali nome inizia caratteri in XML, possono apparire solo in un nome dopo il carattere del primo nome. Anche gli spazi sono vietati nei nomi, quindi questo è un altro punto in cui l'output XML previsto fallirebbe.

Problemi correlati