Fas*_*Raf 7 c# xml xml-serialization restsharp
编辑:当我问我尝试某事的问题时......我已经在请求上设置了XmlNamespace属性,这就是诀窍..
request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";
Run Code Online (Sandbox Code Playgroud)
但我真的不明白为什么......
下一个问题是让RestSharp将xml属性识别为对象属性
在周末的大部分时间里,我一直在讨论这个问题,而我却没有让它发挥作用.
我正在尝试围绕RestFul webservice(MusicBrainz)编写一个包装器.我正在测试一个简单的例子:获取一位艺术家的详细信息并将其放入自定义的Artist对象中.
当我在RestClient上执行Execute时,它结束了,但我的对象属性为null.但是当我使用XmlDeserializer测试反序列化时,objectproperties被填充(但不是对应于属性的属性,但我稍后会解决这个问题) )
在响应的反序列化和将对象放在response.data之间会发生什么?很可能这是我正在制作的"新手"错误,因为这是我使用RestSharp的第一步.
帮助将不胜感激..
退回的xml:
<metadata>
<artist type="Group" id="f1548c5b-329e-4036-921c-02213a04b525">
<name>Uriah Heep</name>
<sort-name>Uriah Heep</sort-name>
<country>GB</country>
<life-span>
<begin>1970</begin>
</life-span>
</artist>
</metadata>
Run Code Online (Sandbox Code Playgroud)
我的课 :
public class Artist
{
public int Id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public string SortName { get; set; }
public string Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在以下代码中输出属性已填充
var output = xml.Deserialize<Artist>(response);
Run Code Online (Sandbox Code Playgroud)
但是同样的响应在调用时不会填充属性
var response = client.Execute<T>(request);
Run Code Online (Sandbox Code Playgroud)
完整代码(为了简单起见,我将测试代码放在通用方法中):
public T Execute<T>(RestRequest request) where T : new()
{
var client = new RestClient();
client.BaseUrl = BaseUrl;
client.Authenticator = null;
//does not fill properties
var response = client.Execute<T>(request);
if (response.ErrorException != null)
{
throw response.ErrorException;
}
var xml = new XmlDeserializer();
//fills properties
var output = xml.Deserialize<Artist>(response);
return response.Data;
}
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为Execute方法在收到响应后尝试根据请求的 RootElement 和 XmlNamespace 属性进行协商,并将它们复制到XmlDeserializer.
handler.RootElement = request.RootElement;
handler.DateFormat = request.DateFormat;
handler.Namespace = request.XmlNamespace;
response.Data = handler.Deserialize<T>(raw);
Run Code Online (Sandbox Code Playgroud)
如果您传递带有不匹配的 XmlNamespace 的 RestRequest,RestSharp XmlDeserializer(在幕后使用 XDocument)将无法将响应 XML 映射到对象属性,您将获得默认/空值。
现在,对于默认实现(当您XmlDeserializer手动创建时),如果您没有设置 XmlNamespace,反序列化器将进行自动检测,基本上忽略响应中的所有命名空间,并仅按名称映射所有属性。
// autodetect xml namespace
if (!Namespace.HasValue())
{
RemoveNamespace(doc);
}
Run Code Online (Sandbox Code Playgroud)
考虑到上述所有因素,很明显为什么在您使用以下行将 XmlNamespace 属性显式设置为请求对象中的匹配命名空间后它开始工作:
request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";
Run Code Online (Sandbox Code Playgroud)
Execute方法将命名空间复制到反序列化器中,并将 XML 适当地映射到对象。