Как я могу создать коллекцию бизнес-объектов из нескольких элементов в XmlDocument - PullRequest
0 голосов
/ 01 декабря 2010

Я пытаюсь создать коллекцию бизнес-объектов из следующего XML-документа, используя .net 4.0 / c #

    <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;

 }

Это прекрасно работает, если речь идет о создании одного экземпляра объекта из первого дочернего элемента, но я не уверен, как создать несколько экземпляров из всех элементов. Мне нужно иметь возможность вернуть коллекцию объектов пользователя, например Collection<User> users = new Collection<User>()

Я мог бы лаять совсем не на то дерево. Любая помощь очень ценится.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Хорошо, так что я наконец понял, что не так с моим кодом. Вместо

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, через которые можно выполнять итерацию, затем я могу напрямую получить доступ к значению этого элемента и установить его в свойствах моего класса.

1 голос
/ 02 декабря 2010

Используя 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);
    }
}
...