2014-05-08 12 views
20

Mam następujący wyjątek od poniższego bloku kodu.Wystąpił błąd podczas analizowania EntityName. Linia1, pozycja 844

Wystąpił błąd podczas analizowania EntityName. Linia 1, pozycja 844.

Próbowałem przeanalizować zestaw danych pobranych z tabeli do zestawu danych.

public DataSet BindMasterData(string xml) 
     { 
      DataSet ds = null; 
      try 
      { 
       ds = new DataSet(); 
       TextReader txtReader = new StringReader(xml); 
       XmlReader reader = new XmlTextReader(txtReader); 
       ds.ReadXml(reader); 
      } 
      catch (Exception ex) 
      { 
       return new DataSet(); 
      } 
      return ds; 
     } 

Wyjaśniłem przyczynę wyjątku, ale nie mogłem go rozwiązać. W tej konkretnej sytuacji ciąg (który jest pobierany z DB) zawiera znak specjalny (&). To powoduje wyjątek. Jak mogę to rozwiązać. Każda pomoc w tej sprawie byłaby świetna.

Dzięki & Pozdrowienia Sebastian

+2

Proszę pokazać część dokumentu, która powoduje wyjątek. – Codor

+0

Ciąg zawiera &. Na przykład A & B Constructions –

Odpowiedz

43

Wystarczy zastąpić je:

Nie ważne w elementach XML:

" " 
' ' 
< &lt; 
> &gt; 
& &amp; 

public static string UnescapeXMLValue(string xmlString) 
    { 
    if (xmlString == null) 
     throw new ArgumentNullException("xmlString") 

    return xmlString.Replace("&apos;", "'").Replace("&quot;", "\"").Replace("&gt;", ">").Replace("&lt;", "<").Replace("&amp;", "&"); 
    } 

public static string EscapeXMLValue(string xmlString) 
    { 

    if (xmlString == null) 
     throw new ArgumentNullException("xmlString") 

    return xmlString.Replace("'","&apos;").Replace("\"", "&quot;").Replace(">","&gt;").Replace("<","&lt;").Replace("&","&amp;"); 
    } 
+2

Dzięki, zadziałało! –

+2

Po napisaniu funkcji Zamień w taki sposób można łatwo zakończyć, powodując błąd. na przykład "Dave's" będzie najpierw "Dave ' s", a następnie stanie się "Dave & apos; s", który będzie wyświetlany jako "Dave ' s". Widać to często na niektórych stronach internetowych, ponieważ ktoś popełnił błąd. Sugerowałbym, żebyś nie używał go zamiast zamieniać, ale zamiast tego patrz na http: // stackoverflow.com/questions/8331119/escape-invalid-xml-characters-in-c-sharp –

1

Jeśli XML jest zbudowane z łańcuchów znaków wtedy będziesz chciał uciec. & powinien stać się &amp;, a < i > powinien być odpowiednio &lt; i &gt;.

Mogą być też inni. Oczywiście powinieneś naprawdę używać odpowiedniego kodera XML, zamiast próbować zrobić to samemu z wielu powodów.

1

Ponieważ dane pochodzą z jakiejś bazy danych, problem może być gorąco ustalone w kontekście opisałeś, ale zdecydowanie zaleciłbym inne podejście. Symbol ampersand nie powinien był pojawić się w xml w pierwszej kolejności, jak to omówiono here. Proszę wyjaśnić, w jaki sposób XML jest generowany i rozwiązać problem.

14

To już odpowiedział, ale okazało się, ładniejszy sposób osiągnięcia tego samego rezultatu robiąc to w .NET 4.5 przy użyciu metody uciec jak poniżej:

var xmlWithEscapedCharacters = SecurityElement.Escape(xmlWithoutEscapedCharacters); 

a potem po prostu wtyczkę string w XML, który jest generowany.

Link: MSDN - SecurityElement.Escape Method

+1

Warto również zauważyć, że jest to również dostępne dla .NET Core https://apisof.net/catalog/System.Security.SecurityElement.Escape(String) – Alastair

Powiązane problemy