如何从XmlDocument中的多个元素创建业务对象的集合

时间:2010-12-01 18:11:47

标签: c# xml linq-to-xml

我正在尝试使用.net 4.0 / c#

从以下xml文档创建业务对象的集合
    <WebServices ErrorFound="False" ServerDateTime="30/11/2010 14:58:58">
        <Results>
            <Users TotalResults="5">
                <UserName UserID="2">John</UserName>
                <UserName UserID="3">Dave</UserName>
                <UserName UserID="4">Jim</UserName>
                <UserName UserID="5">Bob</UserName>
            </Users>
        </Results>
    </WebServices>

这是我需要创建的课程

    public class User
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

每个Users子元素都应该是该类的新实例。 到目前为止,我有这个接受XmlDocument的方法。

public static IEnumerable<User> GetUser(XmlDocument xmlDoc)
{
    XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.OuterXml));
    XDocument doc = XDocument.Load(reader);

    var user = from u in doc.Descendants("WebServices").DescendantsAndSelf("Users")
               select new User()
               {
                   Name = u.Element("UserName").Value,
                   ID = int.Parse(u.Element("UserName").Attribute("UserID").Value)
               };

     List<User> userInstance = user.ToList();
     IEnumerable<User> users= from u in userInstance
                              select u;
     return users;

 }

就第一个子元素生成一个对象实例而言,这很好用,但我不确定如何从所有元素创建多个实例。 我需要能够返回User对象的集合,例如Collection<User> users = new Collection<User>()

我可能完全咆哮着错误的树。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用XPath,您可以编写如下代码:

public class User
{
    public string Name { get; set; }
    public int ID { get; set; }
} 

static void Main(string[] args)
{
    string xml =
        "<WebServices ErrorFound='False' ServerDateTime='30/11/2010 14:58:58'>" +
            "<Results>" +
                "<Users TotalResults='5'>" +
                    "<UserName UserID='2'>John</UserName>" +
                    "<UserName UserID='3'>Dave</UserName>" +
                    "<UserName UserID='4'>Jim</UserName>" +
                    "<UserName UserID='5'>Bob</UserName>" +
                    "</Users>" +
            "</Results>" +
        "</WebServices>";

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);

    var users = from userNameElement in doc.SelectNodes("/WebServices/Results/Users/UserName").OfType<XmlElement>()
                select new User
                {
                    Name = userNameElement.InnerText,
                    ID = Int32.Parse(userNameElement.GetAttribute("UserID"))
                };

    foreach (var user in users)
    {
        Console.WriteLine(user.ID.ToString() + ": " + user.Name);
    }
}

答案 1 :(得分:1)

好的,所以我终于弄清楚我的代码出了什么问题。 而不是

var user = from u in doc.Descendants("WebServices").DescendantsAndSelf("Users")
        select new User()
        {
            Name = u.Element("UserName").Value,
            ID = int.Parse(u.Element("UserName").Attribute("UserID").Value)
        };

我现在有

var user = (from u in doc.Descendants("UserName")
        select new Provider()
        {
            Name = u.Value,
            ID = int.Parse(u.Attribute("UserID").Value)
        });

声明:doc.Descendants("UserName")基本上生成一个可以迭代的UserName元素数组,然后我可以直接访问该元素的值并将其设置为我的类属性。