Referencia a la excepción de entidad no declarada mientras trabaja con XML

StackOverflow https://stackoverflow.com/questions/281682

  •  07-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de establecer el innerxml de un xmldoc pero obtengo la excepción: Referencia a entidad no declarada

XmlDocument xmldoc = new XmlDocument();
string text = "Hello, I am text α   – —"
xmldoc.InnerXml = "<p>" + text + "</p>";

Esto arroja la excepción:

  

Referencia a la entidad no declarada 'alfa'. Línea 2, posición 2 ..

¿Cómo haría para resolver este problema?

¿Fue útil?

Solución

XML, a diferencia de HTML, no define entidades (es decir, referencias con nombre a caracteres UNICODE), por lo que & amp; alpha; & amp; mdash; etc.no se traducen a su carácter correspondiente. Debe usar el valor numérico en su lugar. Solo puedes usar & amp; lt; y & amp; amp; en XML

Si desea crear HTML, use un HtmlDocument en su lugar.

Otros consejos

En .Net, puede usar la clase System.Xml.XmlConvert :

string text = XmlConvert.EncodeName("Hello &alpha;");

Alternativamente, puede declarar las entidades localmente colocando las declaraciones entre corchetes en una declaración DOCTYPE. Agregue el siguiente encabezado a su xml:

<!DOCTYPE documentElement[
<!ENTITY Alpha "&#913;">
<!ENTITY ndash "&#8211;">
<!ENTITY mdash "&#8212;">
]>

Hacer un google en " entidades de caracteres html " para las definiciones de entidad.

Intente reemplazar & amp; Alpha con

  &#913;

La respuesta anterior es correcta. Otra alternativa es vincular su documento html a la DTD donde se definen esas entidades de caracteres, y esa es la definición estándar de XHTML DTD. Su archivo xml debe incluir la siguiente declaración:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">

También puede establecer InnerText en " Hola, soy texto a - - " , haciendo que el XmlDocument los escape automáticamente. Creo.

El uso de un HtmlDocument no era adecuado en mi situación, nuestro sistema tenía un XmlUrlResolver personalizado que usamos para cargar el xml.

//setup
public class CustomXmlResolver : XmlUrlResolver { /* ... */ }
String originalXml; //fetched xml with html entities in it

var doc = new XmlDocument();
doc.XmlResolver = new AdCastXmlResolver();

//making use of a transitional dtd
doc.LoadXml("<!DOCTYPE html SYSTEM \"xhtml1-transitional.dtd\" > " + originalXml);

Utilice la cadena System.Net.WebUtility.HtmlDecode (cadena) que decodificará todos los caracteres codificados de la entidad HTML en su variante Unicode. Está disponible desde dot.net framework 4

Si desea utilizar los nombres de entidad HTML a los que está acostumbrado, el W3C lo tiene cubierto y ha producido "Definiciones de entidades XML para caracteres". http://www.w3.org/TR/xml-entity-names/, que esencialmente es una lista de entidades con nombre muy similar a las que tiene HTML. Pero como se mencionó anteriormente, esto no está integrado en XML y debe ser explícitamente compatible con las aplicaciones XML que desean utilizar estas entidades con nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top