c# - 如何将 xml 响应转换为 C# 中的类对象?

标签 c# xml

您好,我正在将 xml 响应转换为 c# 中的类对象。我已经从 sql 端获取 xml 并调用一个实用程序并获取 xml 并在类对象中进行转换,但使用我的代码不在类中返回 null。任何人都知道我的问题在哪里,请告诉我。

这是我的 xml 数据:

<Users>
      <User>
            <UserId>1</UserId>
            <Email>abc@gmail.com</Email>
            <UserName>abc</UserName>
            <ProfileImage>20160816105401206.jpeg</ProfileImage>
            <Name>abc</Name>

            <InterestId>8</InterestId>
            <FeedId>4608</FeedId>
            <Description>Test</Description>
            <Interest>Cricekt</Interest>    

            <InterestId>12</InterestId>
            <FeedId>4609</FeedId>
            <Description>Test 2</Description>
            <Interest>Read</Interest>    
      </User>
       <User>
            <UserId>2</UserId>
            <Email>xyz@gmail.com</Email>
            <UserName>xyz</UserName>
            <ProfileImage>20160816105401207.jpeg</ProfileImage>
            <Name>xyz</Name>

            <InterestId>8</InterestId>
            <FeedId>4610</FeedId>
            <Description>Test 3</Description>
            <Interest>swim</Interest>    

            <InterestId>12</InterestId>
            <FeedId>4610</FeedId>
            <Description>Test 3</Description>
            <Interest>drive</Interest>    
      </User>
 </Users>

这是我在 C# 中的类(class):

        [XmlRoot]
    public class Users
    {
        [XmlRoot]
        public class User
        {
            [XmlElement]
            public int UserId { get; set; }

            [XmlElement]
            public string Email { get; set; }

            [XmlElement]
            public string UserName { get; set; }

            [XmlElement]
            public string ProfileImage { get; set; }

            [XmlElement]
            public string Name { get; set; }

            [XmlElement]
            public int FeedId { get; set; }

            [XmlElement]
            public string Description { get; set; }

            [XmlElement]
            public string Interest { get; set; }

            [XmlElement]
            public int InterestId { get; set; }              

        }

        [XmlArray("UserList")]
        [XmlArrayItem("User")]
        public User[] ListUsers { get; set; }
    }

这是我在 C# 中的方法:

    public string xmldata()
    {           
        Users obju = new Users();

            string xml = "";
            DataSet ds = DataAccess.ExecuteDataset(Settings.ConnectionString(), "Getxml",1,10);
            if (ds != null && ds.Tables.Count > 0)
            {
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    xml += ds.Tables[0].Rows[i]["XML_F52E2B61-18A1-11d1-B105-00805F49916B"].ToString();
                }
            }

            var serializer = new XmlSerializer(typeof(Users));
            Users result;

            using (TextReader reader = new StringReader(xml))
            {
                result = (Users)serializer.Deserialize(reader);// here i am not getting xml to in class 
            }                                               
        return null;
    }

最佳答案

没有<UserList>包装它们,所以这不是一个 xml 数组。相反,使用:

[XmlElement("User")]
public User[] ListUsers { get; set; }

或更好:List<User>而不是 User[] ;我个人会:

[XmlElement("User")]
public List<User> Users {get; } = new List<User>();

(但这还需要您将根类型重命名为其他名称)

关于 User , 它不是根,所以 [XmlRoot]是多余的;和 [XmlElement]是默认值并自动采用,因此您可以删除所有 [XmlElement]来自 User也是。

为了证明一切正常:

using System;
using System.IO;
using System.Xml.Serialization;

public class Users
{
    public class User
    {
        public int UserId { get; set; }
        public string Email { get; set; }
        public string UserName { get; set; }
        public string ProfileImage { get; set; }
        public string Name { get; set; }
        public int FeedId { get; set; }
        public string Description { get; set; }
        public string Interest { get; set; }
        public int InterestId { get; set; }
    }

    [XmlElement("User")]
    public User[] ListUsers { get; set; }
}
static class Program
{
    static void Main()
    {
        var ser = new XmlSerializer(typeof(Users));
        using (var sr = new StringReader(xml))
        {
            var obj = (Users)ser.Deserialize(sr);
            Console.WriteLine(obj.ListUsers.Length); // 2
        }
    }



    const string xml = @"<Users>
      <User>
            <UserId>1</UserId>
            <Email>abc@gmail.com</Email>
            <UserName>abc</UserName>
            <ProfileImage>20160816105401206.jpeg</ProfileImage>
            <Name>abc</Name>

            <InterestId>8</InterestId>
            <FeedId>4608</FeedId>
            <Description>Test</Description>
            <Interest>Cricekt</Interest>    

            <InterestId>12</InterestId>
            <FeedId>4609</FeedId>
            <Description>Test 2</Description>
            <Interest>Read</Interest>    
      </User>
       <User>
            <UserId>2</UserId>
            <Email>xyz@gmail.com</Email>
            <UserName>xyz</UserName>
            <ProfileImage>20160816105401207.jpeg</ProfileImage>
            <Name>xyz</Name>

            <InterestId>8</InterestId>
            <FeedId>4610</FeedId>
            <Description>Test 3</Description>
            <Interest>swim</Interest>    

            <InterestId>12</InterestId>
            <FeedId>4610</FeedId>
            <Description>Test 3</Description>
            <Interest>drive</Interest>    
      </User>
 </Users>";

}

关于c# - 如何将 xml 响应转换为 C# 中的类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408862/

相关文章:

c# - 如何从 c# .net 中的单列数据中选择多个复选框

c# - 不好的 MVVM 实践? (命令参数)

java - 每次跳过该方法时都使用 TestNG 符号,例如 @parameters 或 @dataprovider...

java - 如果我在 conf 文件夹中的 server.xml 中进行更改,Tomcat 服务器不会启动

c# - 正则表达式模型验证 : Whole Number or Decimal Multiples of . 25

c# - 如何在azure移动应用程序中对表 Controller 进行客户端调用

c# - 无法使用 C# HttpClient 上传文件,Postman 工作正常

c# - 如何指定不需要按顺序排列的必需 xml 子元素列表?

sql - 生成 XML 文件时收到 PL/SQL 错误

php - 如何使用 XPath 执行不区分大小写的搜索并支持非英文字符?