2011-11-29 39 views
5

Tôi có dịch vụ web trả về chuỗi xml làm kết quả. Chuỗi trả lại có định dạng này:Nhúng tài liệu xml vào bên trong chuỗi xml

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

Dữ liệu mà tôi muốn chèn vào thẻ "message" là phiên bản được tuần tự hóa của một đối tượng tùy chỉnh. Định dạng được tuần tự hóa của đối tượng đó chứa các khai báo xml và không gian tên đăng tuần tự hóa. Khi được đưa vào thẻ "message" của chuỗi xml trả về của tôi, XmlSpy nói rằng nó không được định dạng đúng. Làm thế nào tôi nên thoát khỏi các khai báo không gian tên, hoặc là có một cách khác nhau để imbed một đối tượng serialized vào một chuỗi xml?

+0

Khai báo không gian tên dự phòng hoặc mới trong dữ liệu được nhúng không được gây ra lỗi cấu thành tốt, nhưng nhúng cũng khai báo XML bên trong phần tử '' có thể sẽ gây ra điều đó. Nếu việc loại bỏ khai báo XML thừa không khắc phục được vấn đề, thì giá trị trả về của đối tượng hoặc dịch vụ web của bạn tạo ra XML không đúng định dạng. – jasso

Trả lời

6

Chỉ cần chắc chắn rằng <Message> XML của bạn được mã hóa để <, >, ", và & hiển thị như &lt;, &gt;, &quot;&amp;, tương ứng.

Có vài built-in cách để mã hóa các ký tự:

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

string message = System.Security.SecurityElement.Escape(serializedXml); 
  • Sử dụng một XmlTextWriter để làm công việc cho bạn
  • Sử dụng CDATA quấn XML của bạn

Cũng , đây có thể là bản sao của:

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

Điều đó có dễ dàng như việc thực hiện một chuỗi ký tự cho tất cả các biểu diễn khác nhau của các ký tự xml đặc biệt đó không? – ganders

6

Bó chuỗi trong CDATA như vậy:

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

CDATA sẽ thông báo cho một validator để điều trị các nội dung CDATA dưới dạng văn bản bị bỏ qua. Đó thường là cách thuận tiện nhất để nhúng XML (hoặc nội dung không phải là nội dung không có XML) dưới dạng một chuỗi. Bạn có thể gặp vấn đề nếu XML nhúng của bạn chứa CDATA của riêng nó, nhưng nếu không thì đó là một sửa chữa đơn giản.

+0

(googling CDATA ...) – ganders

0

Hãy nghĩ XML là tài liệu không phải là chuỗi. Tạo một nút có tên là "wrapper" và lưu trữ nội dung tệp của bạn trong đó dưới dạng chuỗi được mã hóa Base64. Kết quả sẽ trông như thế này.

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

Mã sau đây cho biết cách thêm trình bao bọc, mã hóa nội dung. Sau đó, nó đảo ngược quá trình để cho thấy rằng tất cả "công trình".

Sử dụng Base64 trong XML cũng có một số ứng dụng khác. Ví dụ: nhúng hình ảnh hoặc các tài liệu khác trong nội dung 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); 
     } 
    } 
} 
Các vấn đề liên quan