Fix: “System.Xml.XmlException: An error occurred while parsing EntityName.”
Ich hatte heute mit einem kleinen XML Problem zu kämpfen. Bei der Generierung des XMLs trat der oben genannte Fehler auf. Problemlösung in kurz: “&”, “<” & “>” maskieren wenn man InnerXml setzt oder “vollständiges” Xml Element setzen.
Problemfall:
class Program
{
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
XmlElement element = doc.CreateElement("element");
element.InnerXml = "hello & good bye";
}
}
Dieser Code endet mit einer Exception. Entweder man setzt InnerText oder maskiert das “&”. Das gleiche gilt auch für “<” bzw. “>” z.B. mit HttpUtility.HtmlEncode. Wenn man komplettes, valides XML reingibt funktioniert es auch:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
XmlElement element = doc.CreateElement("element");
element.InnerXml = "hello <test></test> good bye";
}
Eigentlich völlig logisch. Problematisch wird es nur wenn man z.B. HTML Markup wie “<br/>” und vom User eingegebene Texte (wo auch ein “&” oder “<” drin stehen könnte) auftauchen. Da die Fehlermeldung mir recht nichtsagend war, hab ich mir gedacht es zu bloggen.




Rico
5. May 2010
static string Escape(string text)
{
text = text.Replace(“&”, “&”);
text = text.Replace(” “, “ ”);
text = text.Replace(“”, “>”);
text = text.Replace(“\n”, “”);
return text;
}
Rico
5. May 2010
Hmmm… die Blogengine hat mein Post zerschossen… :/
Robert Mühsig
5. May 2010
Völlig zerschossen? Sieht doch recht plausibel aus, oder?
Mario Noack
5. May 2010
Wie wäre es denn mit der Nutzung von Innertext?
http://msdn.microsoft.com/de-de/library/system.xml.xmlelement.innertext(v=VS.100).aspx
Das sollte doch die ganze Maskierung überflüssig machen.
Schöne Grüße, Mario
Robert Mühsig
5. May 2010
Das geht auch, allerdings wird das komplette Markup dann escaped. Ich wollte es aber quasi “mischen” – was zum Fehlerfall führte.