在C#MVC中使用名称空间或冒号反序列化XML节点

在C#MVC中使用名称空间或冒号反序列化XML节点,c#,xml,model-view-controller,C#,Xml,Model View Controller,我有以下XML作为示例: <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:api="http://www.sample.com/api"> <entry> <existing>true</existing> <api:object category="user" id="100">

我有以下XML作为示例:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:api="http://www.sample.com/api">
  <entry>
    <existing>true</existing>
    <api:object category="user" id="100">
      <api:last-name>Smith</api:last-name>
      <api:first-name>John</api:first-name>
    </api:object>
  </entry>

  <entry>
    <existing>false</existing>
    <api:object category="user" id="101">
      <api:last-name>Smith</api:last-name>
      <api:first-name>Bob</api:first-name>
    </api:object>
  </entry>
</feed>
ElementsUsersAttributes.cs

      [Serializable]
        [XmlType(Namespace = "http://www.w3.org/2005/Atom")]
        [XmlRoot(ElementName = "feed", Namespace = "http://www.w3.org/2005/Atom", IsNullable = false)]

        public class ElementsUsersRoot
        {
            public ElementsUsersRoot()
            {
                ElementsUsersDetails = new List<ElementsUsersData>();
            }

            [XmlElement("entry")]

            public List<ElementsUsersData> ElementsUsersDetails { get; set; }
 [Serializable]
    [XmlRoot("entry")]
    public class ElementsUsersData 
    {


        [XmlElement("existing")]
        public bool IsExisting { get; set; }  

        [XmlElement("api:object")]
        public ElementsUsersAttributes UserAttributes { get; set; }    

    }
[Serializable]
    [XmlRoot("api:object", Namespace = "http://www.sample.com/api")]
    public class ElementsUsersAttributes 
{

        [XmlElement("api:first-name")]
        public string Fname { get; set; }

        [XmlElement("api:last-name")]
        public string Lname{ get; set; }
}
代码如下:

using (var client = new HttpClient())
                {
                    var byteArray = Encoding.ASCII.GetBytes(apiAccount + ":" + apiPassword);
                    var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                    client.DefaultRequestHeaders.Authorization = header;

                    var stream = await client.GetStreamAsync(apiEndpoint);
                    var serializer = new XmlSerializer(typeof(ElementsUsersRoot));

                    ElementsUsersRoot userXmlData = (ElementsUsersRoot)serializer.Deserialize(stream);
                    //Add cache here
                    return userXmlData;

                }

正如注释中提到的,
api
是一个名称空间前缀,它与元素的限定名无关

我还要注意,
[Serializable]
属性与
XmlSerializer
无关,因此可以删除,
[XmlRoot]
属性只与根元素相关

考虑到以上所有因素,这些课程将起作用:

[XmlRoot(ElementName = "feed", Namespace = "http://www.w3.org/2005/Atom")]
public class ElementsUsersRoot
{
    [XmlElement("entry")]
    public List<ElementsUsersData> ElementsUsersDetails { get; set; }
}

public class ElementsUsersData
{
    [XmlElement("existing")]
    public bool IsExisting { get; set; }

    [XmlElement("object", Namespace = "http://www.sample.com/api")]
    public ElementsUsersAttributes UserAttributes { get; set; }
}

public class ElementsUsersAttributes
{
    [XmlElement("first-name")]
    public string Fname { get; set; }

    [XmlElement("last-name")]
    public string Lname { get; set; }
}
[XmlRoot(ElementName=“feed”,命名空间=”http://www.w3.org/2005/Atom")]
公共类元素suserroot
{
[XmlElement(“条目”)]
公共列表元素susersDetails{get;set;}
}
公共类元素SUSERSDATA
{
[XmlElement(“现有”)]
公共布尔存在{get;set;}
[XmlElement(“对象”,命名空间=”http://www.sample.com/api")]
公共元素SusersAttributes用户属性{get;set;}
}
公共类ElementsUsersAttributes
{
[XmlElement(“名字”)]
公共字符串Fname{get;set;}
[XmlElement(“姓氏”)]
公共字符串Lname{get;set;}
}
前缀不是名称的“一部分”。例如,从
http://www.sample.com/api
名称空间。在这段XML中,
api
被用来表示名称空间的事实毫无意义。