2008-11-11 10 views
22

Je suis en train de régler la InnerXml d'un xmldoc mais obtenir l'exception: Référence à une entité non déclaréeRéférence à exception de l'entité non déclarés tout en travaillant avec XML

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

Cela jette l'exception:

Référence à l'entité non déclarée «alpha». Ligne 2, position 2 ..

Comment pourrais-je résoudre ce problème?

Répondre

26

XML, contrairement à HTML ne définit pas des entités (c.-à-références nommées à des caractères UNICODE) si & alpha; & mdash; etc. ne sont pas traduits dans leur caractère correspondant. Vous devez utiliser la valeur numérique à la place. Vous ne pouvez utiliser que & lt; et & amp; en XML

Si vous voulez créer HTML, utilisez un HtmlDocument à la place.

+2

HtmlDocument provient de l'espace de noms System.Windows.Forms http://j.mp/pSmv82 Si vous n'aimez pas son association étroite avec le contrôle WebBrowser ou qui cause des problèmes à votre application, un analyseur HTML pur est disponible via le HTML Agility Pack http://htmlagilitypack.codeplex.com/wikipage?title = Exemples –

6

Essayez de remplacer & Alpha avec

&#913; 
6

La réponse précédente est juste. Une autre alternative consiste à lier votre document html à la DTD où ces entités de caractères sont définies, et c'est la définition DTD XHTML standard. Votre fichier xml doit inclure la déclaration suivante:

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

Pour plus de détails sur comment postuler: http://azurator.blogspot.be/2012/03/parsing-html-into-xelement.html –

0

Vous pouvez également définir le InnerText à "Hello, I am text α – —", ce qui les rend échapper automatiquement XmlDocument. Je pense.

12

En .Net, vous pouvez utiliser la classe System.Xml.XmlConvert:

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

Alternativement, vous pouvez déclarer les entités locales en mettant les déclarations entre crochets dans une déclaration DOCTYPE. Ajoutez l'en-tête suivant à votre xml:

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

Faites un google sur « entités de caractère html » pour les définitions des entités.

0

L'utilisation d'un HtmlDocument ne convenait pas dans ma situation, notre système avait un XmlUrlResolver personnalisé que nous avons utilisé pour charger le fichier 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

Utiliser la chaîne System.Net.WebUtility.HtmlDecode (string) qui décode toutes les entités HTML caractères codés à sa variante Unicode. Il est disponible à partir de dot.net framework 4

0

Si vous voulez utiliser les noms d'entité HTML auxquels vous êtes habitué, le W3C vous a couvert et a produit des "définitions d'entités XML pour les caractères" http://www.w3.org/TR/xml-entity-names/, qui est essentiellement un liste d'entités nommées très similaires à celles que le HTML a. Mais comme mentionné ci-dessus, ceci n'est pas construit en XML, et doit être explicitement supporté par les applications XML qui veulent utiliser ces entités nommées.