2008-11-11 8 views
22

Próbuję ustawić innerxml o xmldoc ale uzyskać wyjątek: odniesienie do podmiotu nierejestrowanejOdniesienie do nielegalnej wyjątkiem podmiotu podczas pracy z XML

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

ta rzuca wyjątek:

Reference do niezarejestrowanego podmiotu "alfa". Linia 2, pozycja 2.

Jak mam rozwiązać ten problem?

Odpowiedz

26

XML, w przeciwieństwie do HTML nie definiuje podmiotów (tj nazwane referencje do znaków Unicode), więc & alfa; & mdash; itp. nie są tłumaczone na ich odpowiedni charakter. Musisz zamiast tego użyć wartości liczbowej. Możesz użyć tylko & lt; i & amp; w XML

Jeśli chcesz utworzyć HTML, użyj zamiast tego HtmlDocument.

+2

HtmlDocument pochodzi z przestrzeni nazw System.Windows.Forms http://j.mp/pSmv82 Jeśli nie podoba Ci się jej ścisłe powiązanie z formantem WebBrowser lub powoduje problemy z aplikacją, to czysty parser HTML jest dostępny przez pakiet HTML Agility Pack http://htmlagilitypack.codeplex.com/wikipage?title = Examples –

6

Poprzednia odpowiedź jest prawidłowa. Inną alternatywą jest połączenie dokumentu HTML z DTD, w którym zdefiniowane są te jednostki znaków, i jest to standardowa definicja DTD XHTML. Plik XML powinien zawierać następujące oświadczenie:

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

Aby uzyskać szczegółowe informacje na temat składania aplikacji: http://azurator.blogspot.be/2012/03/parsing-html-into-xelement.html –

0

Można również ustawić innerText do "Hello, I am text α – —", czyniąc XmlDocument automatycznie nich uciec. Myślę.

12

w .NET, można użyć klasy System.Xml.XmlConvert:

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

Alternatywnie, można zadeklarować podmioty lokalnie poprzez umieszczenie oświadczenia nawiasach kwadratowych w deklaracji DOCTYPE. Dodaj następujący nagłówek do xml:

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

Wykonaj Google na „podmioty znaków html” dla definicji podmiotu.

0

Używanie HtmlDocument nie było odpowiednie w mojej sytuacji, nasz system miał niestandardowy XmlUrlResolver, którego używaliśmy do ładowania 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

Zastosowanie ciąg System.Net.WebUtility.HtmlDecode (string), który dekoduje wszystko podmiotowi html zakodowanych znaków Unicode do jej wariantu. Jest dostępny z frameworka dot.NET 4

0

Jeśli chcesz używać nazw encji kodu HTML, do których jesteś przyzwyczajony, W3C objaśnił cię i wyprodukował "Definicje jednostek XML dla znaków" http://www.w3.org/TR/xml-entity-names/, która zasadniczo jest lista nazwanych obiektów bardzo podobnych do tych, które ma HTML. Ale jak wspomniano powyżej, nie jest to wbudowane w XML i musi być wyraźnie obsługiwane przez aplikacje XML, które chcą używać tych nazwanych encji.

Powiązane problemy