2011-07-20 12 views
25

Mam ciąg znaków (z elementu CDATA), który zawiera opis XML. Muszę rozszyfrować ten ciąg do nowego łańcucha, który wyświetla znaki poprawnie przy użyciu C#Jak rozszyfrować ciąg znaków do łańcucha XML w C#

Istniejący ciąg:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myreport xmlns="http://test.com/rules/client"><admin><ordernumber>123</ordernumber><state>NY</state></report></myreport> 

String Poszukiwany

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myreport xmlns="http://test.com/rules/client"> 
<admin><ordernumber>123</ordernumber><state>NY</state></report></myreport> 
+0

ale twój istniejący ciąg jest * nieprawidłowy * – naveen

+0

@naveen: Na pewno to tylko _contents_ ciągu ... –

+0

@Jeff Mercado: użyłem linqpad, aby napisać odpowiedź, gdy zobaczyłem, że łańcuch jest nieprawidłowy i wygrał 'HtmlDecode' Działa tak, jak akceptuje ciąg 'string'. był merley wskazując, że nasz OP musi uciekać '' '' – naveen

Odpowiedz

5

Jak Kirill i msarchet powiedział, można użyć HttpUtility.HtmlDecode z System.Web. Uwalnia właściwie wszystko.

Jeśli nie chcą odwoływać System.Web można użyć trochę sztuczkę który obsługuje wszystkie XML ucieczki, ale nie HTML specyficzne ucieczki jak &eacute;:

public static string XmlDecode(string value) { 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.LoadXml("<root>" + value + "</root>"); 
    return xmlDoc.InnerText; 
} 

Można również użyć RegEx lub prosty string.Replace, ale obsługuje on tylko podstawowe przechodzenie XML. Rzeczy takie jak &#x410; lub &eacute; są przykładami trudniejszymi do obsługi.

+0

Nie będę parsować XML/HTML z RegEx: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml -self-included-tags/ – cederlof

+0

(podobała mi się metoda XmlDocument) +1 – cederlof

-1

Można również rozważyć metodę analizy statycznej z XDocument. Nie jestem pewien, jak to się ma do innych wymienionych tutaj, ale wydaje się, że dobrze parsuje te struny.

Gdy dojdziesz wynikowy XDocument, można zawrócić z ToString aby uzyskać ciąg powrotem:

string parsedString = XDocument.Parse("<My XML />").ToString(); 
1

Można użyć HTML.Raw. W ten sposób znaczniki nie są kodowane.

+0

Czy możesz podać przykładowy kod, aby lepiej wyjaśnić swoją odpowiedź? – winhowes

0

Trzeba tylko zastąpić zeskalowanymi znakami swoje oryginały.

string stringWanted= existingString.Replace("&lt;", "<") 
                .Replace("&amp;", "&") 
                .Replace("&gt;", ">") 
                .Replace("&quot;", "\"") 
                .Replace("&apos;", "'"); 
+0

To bardzo dziwne.Właśnie stworzyłem przykład (https://dotnetfiddle.net/vRfBTE), który spodziewałem się zademonstrować problem i działa dokładnie zgodnie z życzeniem. Dziwne jest to, że ja * wiem * ta dokładna sytuacja jest odpowiedzialna za błąd parsowania XML w bazie kodu, który utrzymuję, że naprawiłem * wczoraj *. Przynajmniej, myślę, że to dokładnie to samo. Anuluję notatkę i usuniemy mój oryginalny komentarz, dopóki nie otrzymam okazji do sprawdzenia. –

0

Jego WebUtility.HtmlDecode teraz z System.Net.

Powiązane problemy