2010-10-01 15 views
10

Tengo el siguiente código:análisis XML problema con '&' en el texto del elemento

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(new InputSource(new StringReader(inputXml))); 

Y el paso de análisis se throwning:

SAXParseException: The entity name must immediately follow 
        the '&' in the entity reference 

debido a lo siguiente '&' en mi inputXml :

<Line1>Day & Night</Line1> 

No tengo el control en el XML de entrada. ¿Cómo puedo analizar esto de forma segura/correcta?

Respuesta

31

En pocas palabras, la entrada "XML" no es XML válido. La entidad debe ser codificada, es decir .:

<Line1>Day &amp; Night</Line1> 

Básicamente, no hay manera "correcta" para solucionar este problema diciendo que no sea el proveedor XML que le están dando a la basura y conseguir ellos para solucionarlo. Si se encuentra en una situación horrible en la que tiene que lidiar con ella, entonces el enfoque que tome dependerá probablemente del rango de valores que se espera que reciba.

Si no hay entidades en el documento en absoluto, una sustitución de expresiones regulares de & con &amp; antes del procesamiento haría el truco. Pero si envían algunas entidades correctamente, deberá excluirlas de la coincidencia. Y en la rara oportunidad de que realmente quisieran enviar el código de la entidad (es decir, enviado a &amp; pero significaba &amp;amp;), no tendrá suerte.

Pero bueno, es culpa del proveedor de todos modos, y si su intento de corregir datos no válidos no es exactamente lo que querían, hay algo simple que pueden hacer para solucionarlo. :-)

+0

Ah, gracias por eso. Temía que ese fuera el caso. Parece que algunas llamadas telefónicas están en orden :) –

+1

Hola chicos, tuve un problema similar, pero reemplazando "&" con "&" antes del procesamiento (es decir, StringEscapeUtils.unescapeHtml()) no soluciona mi problema? – dale

5

Su entrada XML no es XML válido; desafortunadamente no se puede usar de manera realista un analizador XML para analizar esto.

Tendrá que procesar previamente el texto antes de pasarlo a un analizador XML. Aunque puede hacer una cadena de reemplazar, reemplazando '& ' con '&amp; ', esto no va a detectar cada aparición de & en la entrada, pero es posible que pueda encontrar algo que sí lo haga.

3

es inputXML una cadena? A continuación, utilice la siguiente:

inputXML = inputXML.replaceAll("&\\s+", "&amp;"); 
+0

Buena idea, pero como se indicó anteriormente, debe tener cuidado con las entidades en el documento. –

+1

Pruebe esta solución que tiene una apariencia negativa anticipada: http://stackoverflow.com/a/1944951/107277 –

+0

¿Debería ser esto inputXML = inputXML.replaceAll ("& \\ s +", "&"); –

4

utilicé marco ordenado antes de análisis XML

final StringWriter errorMessages = new StringWriter(); 
final String res = new TidyChecker().doCheck(html, errorMessages); 
... 
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = db.parse(new InputSource(new StringReader(addRoot(html)))); 
... 

Y todo Ok