簡體   English   中英

在xml字符串中嵌入xml文檔

[英]Embedding an xml document inside an xml string

我有一個Web服務,它返回一個xml字符串作為結果。 返回字符串采用以下格式:

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

我想要插入“message”標記的數據是自定義對象的序列化版本。 該對象的序列化格式包含序列化后的xml和名稱空間聲明。 當它被扔進我的返回xml字符串的“message”標簽時,XmlSpy說它沒有格式良好。 我應該如何擺脫名稱空間聲明,還是有一種不同的方法將序列化對象嵌入到xml字符串中?

只需確保對<Message> XML進行編碼,以便<>"&顯示為&lt;&gt;&quot;&amp;

編碼字符的內置方法很少:

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

string message = System.Security.SecurityElement.Escape(serializedXml);
  • 使用XmlTextWriter為您完成工作
  • 使用CDATA包裝XML

此外,這可能與以下內容重復:

  1. 編碼XML文本數據的最佳方法

將字符串包裝在CDATA中,如下所示:

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

CDATA將通知驗證者將CDATA內容視為忽略文本。 這通常是將XML(或標記非XML內容)嵌入字符串的最便捷方式。 如果嵌入式XML包含自己的CDATA,則可能會遇到問題,但這是一個簡單的修復。

將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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM