2011-11-29 16 views
5

के अंदर एक एक्सएमएल दस्तावेज़ एम्बेड करना मेरे पास एक वेब सेवा है जो परिणाम के रूप में एक एक्सएमएल स्ट्रिंग देता है। वापसी स्ट्रिंग इस प्रारूप में:एक एक्सएमएल स्ट्रिंग

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

डेटा है कि मैं "संदेश" टैग में सम्मिलित करना चाहते हैं एक कस्टम वस्तु का एक धारावाहिक संस्करण है। उस ऑब्जेक्ट के क्रमबद्ध प्रारूप में xml और नेमस्पेस घोषणाएं क्रमबद्धता पोस्ट करती हैं। जब यह मेरी वापसी xml स्ट्रिंग के "संदेश" टैग में फेंक दिया जाता है, तो XmlSpy का कहना है कि यह अच्छी तरह से गठित नहीं है। मुझे नेमस्पेस घोषणाओं से कैसे छुटकारा पाना चाहिए, या क्या एक धारावाहिक ऑब्जेक्ट को xml स्ट्रिंग में एम्बेड करने का कोई अलग तरीका है?

+0

निरर्थक या नया नाम स्थान घोषणाओं अच्छे प्रकार से निर्मित त्रुटि नहीं पैदा कर करना चाहिए, लेकिन यह भी embedding अपने '' तत्व के अंदर XML घोषणा शायद उस का कारण होगा। यदि अतिरिक्त एक्सएमएल घोषणा को हटाने से समस्या ठीक नहीं होती है, तो या तो आपका ऑब्जेक्ट सीरियलाइजेशन या वेब सेवा रिटर्न वैल्यू विकृत एक्सएमएल उत्पन्न करता है। – jasso

उत्तर

6

बस सुनिश्चित करें कि आपके <Message> एक्सएमएल एन्कोड किया गया है ताकि <, >, ", और & रूप &lt;, &gt;, &quot; और &amp; क्रमश दिखाई देते हैं।

रहे हैं कुछ में निर्मित वर्ण एन्कोड करने के लिए तरीके: के लिए आप

  • उपयोग CDATA काम करने के लिए एक XmlTextWriter का उपयोग

    string message = System.Web.HttpUtility.HtmlEncode(serializedXml); 
    
    string message = System.Security.SecurityElement.Escape(serializedXml); 
    
    • अपने XML

    इसके अलावा रैप करने के लिए , यह शायद एक डुप्लिकेट है:

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

    क्या यह एक विशेष स्ट्रिंग करने जैसा आसान होगा। उन विशेष xml अक्षरों के सभी अलग-अलग प्रस्तुतिकरणों के लिए जगह? – ganders

    6

    लपेटें तो जैसे CDATA में स्ट्रिंग:

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

    CDATA नजरअंदाज कर दिया पाठ के रूप में CDATA सामग्री के इलाज के लिए एक सत्यापनकर्ता को सूचित करेंगे। स्ट्रिंग के रूप में एक्सएमएल (या टैगगी गैर-एक्सएमएल सामग्री) को एम्बेड करने के लिए अक्सर यह सबसे उपयुक्त तरीका होता है। यदि आपके एम्बेडेड एक्सएमएल में अपना स्वयं का सीडीएटीए है, तो आप समस्याओं में भाग सकते हैं, लेकिन अन्यथा यह एक साधारण फिक्स है।

    +0

    (googling सीडीएटीए ...) – ganders

    0

    XML के बारे में सोचें दस्तावेज़ के रूप में एक स्ट्रिंग नहीं। "wrapper" नामक नोड बनाएं, और अपनी फ़ाइल की सामग्री को बेस 64 एन्कोडेड स्ट्रिंग के रूप में संग्रहीत करें। परिणाम इस तरह दिखेगा।

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

    निम्नलिखित कोड दिखाता है कि रैपर जोड़ने के लिए, सामग्री को एन्कोड करें। फिर यह यह दिखाने के लिए प्रक्रिया को उलट देता है कि यह सब "काम करता है"।

    एक्सएमएल में बेस 64 का उपयोग करने के साथ-साथ कई अन्य अनुप्रयोग भी हैं। उदाहरण के लिए छवियों को एम्बेड करना, या 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); 
         } 
        } 
    } 
    
    संबंधित मुद्दे