2011-11-29 3 views
5

결과로 XML 문자열을 반환하는 웹 서비스가 있습니다. 반환 문자열은 다음 형식으로되어 있습니다 :XML 문자열을 XML 문자열에 포함하기

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

나는 "메시지"태그에 삽입 할 데이터는 사용자 정의 객체의 직렬화 된 버전입니다. 해당 객체의 직렬화 된 형식에는 직렬화 이후에 XML 및 네임 스페이스 선언이 포함됩니다. XmlSpy가 리턴 XML 문자열의 "message"태그에 던져지면 XmlSpy는 형식이 올바르지 않다고 말합니다. 네임 스페이스 선언을 제거하려면 어떻게해야합니까? 아니면 serialize 된 객체를 XML 문자열에 imbed하는 다른 방법이 있습니까?

+0

중복 또는 새 네임 스페이스 선언은 정형식 오류가 발생하지 않아야하지만, 또한 당신의''요소 내부의 XML 선언을 삽입하는 것은 아마 원인이됩니다. 추가 XML 선언을 제거해도 문제가 해결되지 않으면 개체 직렬화 또는 웹 서비스 반환 값이 잘못된 XML을 생성합니다. – jasso

답변

6

은 그냥 <Message> XML 인코딩되어 있는지 확인 그래서 <>, "& 각각 &lt;, &gt;, &quot;&amp;로 표시 있음.

이 있습니다 몇 가지 내장 된 문자 인코딩하는 방법 : 또한

당신의 XML을 포장하는

  • 사용 CDATA에 대한 작업을 수행하기 위해 XmlTextWriter를 사용

    string message = System.Web.HttpUtility.HtmlEncode(serializedXml); 
    
    string message = System.Security.SecurityElement.Escape(serializedXml); 
    
  • +0

    그 특수 xml 문자의 모든 다른 표현에 대해 string.replace를 수행하는 것만 큼 간단할까요? – ganders

    6

    랩과 같이 CDATA의 문자열 :

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

    CDATA는 무시 텍스트로 CDATA 내용을 치료하기 위해 발리를 알려줍니다. XML (또는 tagy가 아닌 비어있는 XML 콘텐츠)을 문자열로 포함시키는 것이 가장 편리한 방법입니다. 임베디드 XML에 자체 CDATA가 포함되어 있으면 문제가 발생할 수 있지만 그렇지 않은 경우 간단한 수정이 필요합니다.

    +0

    (검색하는 CDATA ...) – ganders

    0

    XML을 문자열이 아닌 문서로 생각하십시오. "wrapper"라는 노드를 만들고 파일의 내용을 Base64로 인코딩 된 문자열로 저장합니다. 결과는 다음과 같습니다.

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

    다음 코드는 래퍼를 추가하고 콘텐츠를 인코딩하는 방법을 보여줍니다. 그런 다음 프로세스를 되돌려 모든 것이 작동 함을 보여줍니다.

    XML에서 Base64를 사용하면 여러 가지 다른 응용 프로그램도 사용할 수 있습니다. 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); 
         } 
        } 
    } 
    
    관련 문제