![](/img/trans.png)
[英]Deserialize XML document to C# class, with multiple root (xmlns) namespaces
[英]C# XML Deserialize 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));
}
您的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;
}
用這個:
XmlReaderSettings settings = new XmlReaderSettings();
using (StringReader textReader = new StringReader(xml))
{
using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
{
myObject =(CampaingList)mySerializer.Deserialize(xmlReader);
}
}
這樣,您可以使用中間文本閱讀器直接反序列化xml字符串。
當您不再需要流時,可以使用它們來關閉/處理流。 如果您感到舒適,可以明確地重寫它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.