2012-04-17 11 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> 

、 「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

次のようにXMLから、それをデシリアライズすることができます

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

以下のようにXmlRootAttribute飾らすべきですか? – JotaBe

+0

XDocument xmlDoc = XDocument.Parse(xml); – Reinard

+0

問題は 'PerformAndReadHttpRequest'の内部にある可能性があります。元の応答はどのようにして、どのように文字列に変換しますか? – JotaBe

答えて

4

あなたCompaignListクラスは、その後、あなたのXMLDOCが何であるかをクラス

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

ありがとう、それは元の問題を修正しました。しかし、次のAPIコール(今は1つのキャンペーンの詳細を要求しています)は同じ問題を抱えており、XMLRootを追加することは役に立ちません。 – Reinard

+0

逆シリアル化しようとしているオブジェクトモデルとXMLをポストします。あなたをお手伝いします。 – RajN

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

+0

私は本番でこのコードを使用していますので、元の 'xml'文字列と関係させる必要があります。それを見せてください。文字列の場合、UTF-8にすることはできません。バイト配列の場合、解決策があります。 – JotaBe

+0

OPを更新しました。 – Reinard

関連する問題