2011-12-15 28 views
6

estoy recibiendo este error cuando se ejecuta este código: 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 error de carácter no válido

Los nodos que desde el archivo XML original sí contienen caracteres no válidos, pero como estoy extracción de los caracteres no válidos fuera de los nodos, los nodos deben ser creados. ¿Qué tipo de codificación debo hacer en el documento XML original? ¿Necesito decodificar 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); 

Esto es lo que ve el XML original, como:

<?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> 

Se supone que el nuevo documento a tener este aspecto:

<?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

es como hablar con usted, ¿dónde está el XML? – ajreal

+0

@ajreal Solo agrégalo –

+1

¿Por qué publicas la versión limpia? – ajreal

Respuesta

10

Simplemente no se puede utilizar un nombre de elemento comenzar con número

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

php parse xml - error: StartTag: invalid element name

Un buen artículo: - http://www.xml.com/pub/a/2001/07/25/namingparts.html

un nombre es un comienzo simbólico con una letra o una de algunos caracteres de puntuación, y continúa con letras, dígitos, guiones, guiones bajos, dos puntos o puntos, conocidos en conjunto como caracteres de nombre.

0

Asegúrese de que los scripts tienen misma codificación: si se trata de UTF asegúrese de que estén sin Marca de Orden de Byte (BOM) al comienzo del archivo. Para hacerlo, abra su archivo XML con un editor de texto como Notepad ++ y convierta su archivo en "UTF-8 sin BOM".

que tenían un error similar, pero con un json file

5

usted no ha escrito donde se obtiene el error. En caso de que sea limpiado después de que el valor, esto es mi suposición:

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

Esta sustitución no está escrito para cuerdas codificación UTF-8 (que son utilizados por DOMDocument). Puede que sea compatible con UTF-8 mediante el uso de la u-modifier (PCRE8)­Docs:

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

Es sólo una conjetura, le sugiero que haga que sea más precisa en su pregunta qué parte de su código provoca el error.

1

Incluso si __cleandata() eliminará todos los demás caracteres que los alfabetos latinos a-z y números, no garantiza necesariamente que el resultado sea un nombre XML válido. Su función puede devolver cadenas que comienzan con un número pero los números son ilegales nombre comienzan caracteres en XML, solo pueden aparecer en un nombre después del primer nombre del carácter. También los espacios están prohibidos en los nombres, por lo que ese es otro punto donde su salida XML esperada fallaría.

Cuestiones relacionadas