2008-11-11 10 views
22

Estoy tratando de establecer el InnerXml de un xmldoc pero conseguir la excepción: Referencia a entidad no declaradaReferencia a excepción entidad no declarada, mientras que la utilización de XML

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

Esto produce la excepción:

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

¿Cómo podría resolver este problema?

Respuesta

26

XML, a diferencia de HTML no define de manera & alfa entidades (es decir, nominativo a caracteres Unicode); & mdash; etc. no se traducen a su personaje correspondiente. Debe usar el valor numérico en su lugar. Solo puede usar & lt; y & amp; en XML

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

+2

HtmlDocument viene del espacio de nombres System.Windows.Forms http://j.mp/pSmv82 Si no le gusta su asociación cercana con el control WebBrowser o que causa problemas a su aplicación, un analizador HTML puro está disponible a través de el HTML Agility Pack http://htmlagilitypack.codeplex.com/wikipage?title = Ejemplos –

6

Intente reemplazar & alfa con

&#913; 
6

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 XHTML DTD estándar. 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"> 
+0

Para detalles sobre cómo postularse: http://azurator.blogspot.be/2012/03/parsing-html-into-xelement.html –

0

También podría establecer el InnerText a "Hello, I am text α – —", haciendo que el XmlDocument escapar de forma automática. Creo.

12

En NET, puede utilizar la clase System.Xml.XmlConvert:

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

Alternativamente, se puede declarar las entidades a nivel local, poniendo las declaraciones entre corchetes en una declaración DOCTYPE. Añadir la siguiente cabecera a su xml:

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

Hacer un google de "HTML" de carácter entidades para las definiciones de entidades.

0

El uso de un HtmlDocument no era adecuado en mi situación, nuestro sistema tenía un XmlUrlResolver personalizado que utilizamos 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); 
-1

System.Net.WebUtility.HtmlDecode Usar cadena (string) que decodificar toda entidad HTML caracteres codificados a su variante de Unicode. Está disponible en dot.net framework 4

0

Si desea utilizar los nombres de las entidades HTML a las que está acostumbrado, el W3C lo cubrió y produjo "Definiciones de entidad XML para caracteres" http://www.w3.org/TR/xml-entity-names/, que esencialmente es un lista de entidades nombradas muy similares a las que tiene HTML. Pero como se mencionó anteriormente, esto no está integrado en XML, y necesita ser apoyado explícitamente por las aplicaciones XML que desean usar estas entidades nombradas.

Cuestiones relacionadas