2012-04-17 206 views
1

我的代碼:C#XML反序列化XMLNS

CampaignList myObject; 
XmlSerializer mySerializer = new XmlSerializer(typeof(CampaignList)); 
**myObject = (CampaignList)mySerializer.Deserialize(xmlDoc.CreateReader());** 

錯誤:

<CampaignListXml xmlns='api.paycento.com/1.0'> werd niet verwacht. 
[InvalidOperationException: <CampaignListXml 
xmlns='api.paycento.com/1.0'> werd niet verwacht.] 
Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCampaignList.Read4_CampaignListXml() 
+214 

XML響應:

<CampaignListXml xmlns="api.paycento.com/1.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<Allcampaign> 
</Allcampaign> 
</CampaignListXml> 

我已經嘗試添加編碼參數到Deserialize方法,但它給出了一個錯誤「XMLSerializer不支持UTF8」。我試過UTF8,UTF-8和System.Text.Encoding.UTF8.EncodingName;

這是整個代碼,如果你想要關注它。

public IEnumerable<Campaign> GetCampaigns() 
    { 
     return GetCampaigns("active", 0, 50, "", ""); 
    } 
    public IEnumerable<Campaign> GetCampaigns(string status, int startIndex, int pageSize, string orderby, string sort) 
    { 
     return GetCampaigns(status, startIndex, pageSize, orderby, sort, SessionKey); 
    } 
    public IEnumerable<Campaign> GetCampaigns(string status, int startIndex, int pageSize, string orderby, string sort, string sessionKey) 
    { 
     if (string.IsNullOrEmpty(sessionKey) || sessionKey.Length != 34) 
      throw new ArgumentException("Session key must be 34 chars long. " + sessionKey.Length); 
     string suffix = String.Format("campaigns/all/?status={0}&start={1}&psize={2}&orderby={3}&sort={4}&session={5}", status, startIndex, pageSize, orderby, sort, sessionKey); 
     string uri = BASE_URL + suffix; 
     string response = PerformAndReadHttpRequest(uri, "GET", ""); 
     string xml = "<CampaignListXml " + response.Substring(response.IndexOf('>'));  
     CampaignList myObject; 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      using (StringReader textReader = new StringReader(xml)) 
      { 
       using (XmlReader xmlReader = XmlReader.Create(textReader, settings)) 
       { 
        XmlSerializer mySerializer = new XmlSerializer(typeof(CampaignList)); 
        myObject = (CampaignList)mySerializer.Deserialize(xmlReader); 
       } 
      } 
     return myObject.Campaign; 
    } 
    #endregion 
    #region util methods 
    private HttpWebResponse DoHttpWebRequest(String uri, String method, string data) 
    { 
     HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest; 
     req.KeepAlive = false; 
     req.ContentType = "application/xml"; 
     req.Method = method; 
     if ((method.Equals("POST") || method.Equals("PUT")) && data != null) 
     { 
      byte[] buffer = Encoding.UTF8.GetBytes(data); 
      Stream PostData = req.GetRequestStream(); 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 
     } 
     return req.GetResponse() as HttpWebResponse; 
    } 
    private string ReadHttpResponse(HttpWebResponse response) 
    { 
     Encoding enc = System.Text.Encoding.UTF8; 
     StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc); 
     string returnVal = loResponseStream.ReadToEnd(); 
     loResponseStream.Close(); 
     response.Close(); 
     return returnVal; 
    } 
    private string PerformAndReadHttpRequest(String uri, String method, string data) 
    { 
     return ReadHttpResponse(DoHttpWebRequest(uri, method, data)); 
    } 
+0

什麼類是你的xmlDoc中? – JotaBe 2012-04-17 12:41:21

+0

XDocument xmlDoc = XDocument.Parse(xml); – Reinard 2012-04-17 12:48:37

+0

問題可以在'PerformAndReadHttpRequest'裏面原始響應怎麼樣,以及如何將它轉換爲字符串? – JotaBe 2012-04-17 14:16:16

回答

4

CompaignList類應XmlRootAttribute裝飾如下

[XmlRoot("CampaignListXml", Namespace = "api.paycento.com/1.0")] 
public class CampaignList 
{ 
} 

然後,你可以從XML反序列化,如下

using (StringReader reader = new StringReader(xml)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(CampaignList)); 
    CampaignList x1 = serializer.Deserialize(reader) as CampaignList; 
} 
+0

謝謝,它解決了原來的問題。但是接下來的API調用(現在請求一個廣告系列的詳細信息)會帶來同樣的問題,並且添加XMLRoot也無濟於事。 – Reinard 2012-04-18 09:46:25

+0

請發佈您的對象模型和您試圖反序列化的XML。很高興幫助你。 – RajN 2012-04-18 12:43:59

0

使用此:

XmlReaderSettings settings = new XmlReaderSettings(); 
    using (StringReader textReader = new StringReader(xml)) 
    { 
     using (XmlReader xmlReader = XmlReader.Create(textReader, settings)) 
     { 
     myObject =(CampaingList)mySerializer.Deserialize(xmlReader); 
     } 
    } 

這樣你直接反序列化的XML字符串,與中間的文本閱讀器。

當你不再需要它們時,用戶可以關閉/處理這些流。如果你感覺更舒適,你可以明確地重寫它。

+0

獲取相同的錯誤。 – Reinard 2012-04-17 13:10:01

+0

我在生產中使用此代碼,因此它必須與原始'xml'字符串有關。請展示它。如果它是一個字符串,它不能是UTF-8。如果它是一個字節數組,那麼就有一個解決方案。 – JotaBe 2012-04-17 13:11:29

+0

更新了OP。 – Reinard 2012-04-17 13:32:19