2011-11-29 15 views
5

Mam usługę sieci Web, która zwraca ciąg xml jako wyniki. Ciąg powrót jest w następującym formacie:Osadzanie dokumentu xml wewnątrz ciągu xml

<ReturnValue> 
    <ErrorNumber>0 
</ErrorNumber> 
<Message>my message</Message> 
</ReturnValue> 

Dane, które chcę wstawić do „message” znacznik jest odcinkach wersja niestandardowego obiektu. Zserializowany format tego obiektu zawiera postyfikację xml i deklaracje przestrzeni nazw. Kiedy zostanie on wrzucony do znacznika "message" w zwracanym ciągu xml, XmlSpy mówi, że nie jest dobrze uformowany. Jak mam pozbyć się deklaracji przestrzeni nazw, czy istnieje inny sposób na umieszczenie serializowanego obiektu w łańcuchu xml?

+0

Zbędne lub nowe deklaracje przestrzeni nazw w osadzonym danych nie powinno powodować błędy dobrego ukształtowania, ale także osadzanie deklarację XML wewnątrz elementu '' prawdopodobnie spowoduje, że. Jeśli usunięcie dodatkowej deklaracji XML nie rozwiąże problemu, to albo serializacja obiektu, albo wartość zwracana przez serwis WWW spowoduje zniekształcenie XML. – jasso

Odpowiedz

6

Wystarczy upewnić się, że XML <Message> jest kodowany tak, że <, >, " i & pokazać się jako &lt;, &gt;, &quot; i &amp;, odpowiednio.

Istnieje kilka wbudowany w sposób do kodowania znaków:

string message = System.Web.HttpUtility.HtmlEncode(serializedXml); 

string message = System.Security.SecurityElement.Escape(serializedXml); 
  • Korzystanie XmlTextWriter do pracy dla Ciebie
  • użytkowania CDATA owinąć XML

także , jest to prawdopodobnie duplikat:

  1. Best way to encode text data for XML
+0

Czy byłoby to tak proste, jak po prostu napisanie ciągu znaków.wystąpienie dla wszystkich różnych reprezentacji tych specjalnych znaków xml? – ganders

6

Wrap ciąg w CDATA tak:

<![CDATA[your xml, which can be multi-line]]> 

CDATA poinformuje walidatora traktować zawartość CDATA jak ignorowane tekstu. Często jest to najbardziej celowy sposób osadzania XML (lub taggy nie-XML) jako ciąg. Możesz napotkać problemy, jeśli twój osadzony XML zawiera własny CDATA, ale poza tym jest to prosta naprawa.

+0

(Googling CDATA ...) – ganders

0

Wyobraź sobie XML jako dokument, a nie ciąg. Utwórz węzeł o nazwie "wrapper" i zapisz w nim zawartość pliku w postaci zakodowanego ciągu Base64. Wyniki będą wyglądać tak.

<ReturnValue> 
    <ErrorNumber>0</ErrorNumber> 
    <Message>my message</Message> 
    <wrapper type="bin.base64">PD94bWwgdmVyc2lvbj0iMS4wIj8+PHhzbDpzdHlsZXNoZWV0IHZ 
lcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0 
iIHhtbG5zOm1zeHNsPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnhzbHQiPjx4c2w6b3V0cHV0IG1 
ldGhvZD0ieG1sIiAvPjx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPjwveHNsOnRlbXBsYXRlPjwveHNsOnN 
0eWxlc2hlZXQ+</wrapper> 
</ReturnValue> 

Poniższy kod pokazuje, jak dodać opakowanie, zakodować zawartość. Następnie odwraca proces, aby pokazać, że wszystko "działa".

Używanie Base64 w XML ma również wiele innych aplikacji. Na przykład osadzanie obrazów lub innych dokumentów w treści XML.

using System; 
using System.IO; 
using System.Xml; 

public class t 
{ 

    static public string EncodeTo64(string toEncode) { 
     byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
     string returnValue = System.Convert.ToBase64String(toEncodeAsBytes); 
     return returnValue; 
    } 

    static public string DecodeFrom64(string encodedData) { 
     byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); 
     string returnValue = System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes); 
     return returnValue; 
    } 

    public static void Main() { 
     try { 
     //Create the XmlDocument. 
     XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(@" 
      <ReturnValue> 
      <ErrorNumber>0</ErrorNumber> 
      <Message>my message</Message> 
      </ReturnValue> 
      "); 

      XmlNode nodeMessage = doc.SelectSingleNode("/ReturnValue/Message"); 
      if(nodeMessage != null) { 
      XmlDocument docImport = new XmlDocument(); 
       docImport.Load("docwithnamespace.xml"); 

       // create a wrapper element for the file, then import and append it after <Message> 
       XmlElement nodeWrapper = (XmlElement)doc.CreateElement("wrapper"); 
       nodeWrapper.SetAttribute("type", "bin.base64"); 

       nodeWrapper = (XmlElement)doc.ImportNode(nodeWrapper, true); 
       XmlNode ndImport = nodeMessage.ParentNode.AppendChild(nodeWrapper.CloneNode(true)); 
       ndImport.InnerText = EncodeTo64(docImport.OuterXml); 
       doc.Save("wrapperadded.xml"); 

       // Next, let's test un-doing the wrapping 
       // Re-load the "wrapped" document 
       XmlDocument docSaved = new XmlDocument(); 
       docSaved.Load("wrapperadded.xml"); 

       // Get the wrapped element, decode from base64 write to disk 
       XmlNode node = doc.SelectSingleNode("/ReturnValue/wrapper"); 
       if(node != null) { 
        // Load the content, and save as a new XML 
        XmlDocument docUnwrapped = new XmlDocument(); 
        docUnwrapped.LoadXml(DecodeFrom64(node.InnerText)); 
        docUnwrapped.Save("unwrapped.xml"); 
        Console.WriteLine("Eureka"); 
       } 
      } 


     } catch(Exception e) { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 
Powiązane problemy