0

How can I Convert this xml Records object into List<dp_donorsearch>. My current code is below but I want to find best way to do this..... any idea?

<result>
    <record>
        <field name="donor_id" id="donor_id" value="9879" />
        <field name="first_name" id="first_name" value="Trix5647" />
        <field name="last_name" id="last_name" value="Rabbit657" />
        <field name="email" id="email" value="[email protected]" />
        <field name="business_phone" id="business_phone" value="" />
        <field name="mobile_phone" id="mobile_phone" value="" />
        <field name="home_phone" id="home_phone" value="" />
        <field name="address" id="address" value="Street S.W. " />
        <field name="address2" id="address2" value="" />
        <field name="city" id="city" value="Quaker" />
        <field name="state" id="state" value="PA" />
        <field name="zip" id="zip" value="1234" />
        <field name="country" id="country" value="USA" />
    </record>
</result>

C# Code

 public class dp_donorsearch
    {
        public string donor_id { get; set; }
        public string first_name { get; set; }
        public string last_name { get; set; }
        public string email { get; set; }
        public string business_phone { get; set; }
        public string mobile_phone { get; set; }
        public string home_phone { get; set; }
        public string address { get; set; }
        public string address2 { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string zip { get; set; }
        public string country { get; set; } 

        public static List<dp_donorsearch> Load(string url)
        {
            var list = new List<dp_donorsearch>();
            var xmlDoc = new XmlDocument();
            xmlDoc.Load(url);

            list.AddRange(from XmlNode record in xmlDoc.SelectNodes("result/record")
                          select new dp_donorsearch
                          {
                              donor_id = ReadField(record, "donor_id"),
                              first_name = ReadField(record, "first_name"),
                              last_name = ReadField(record, "last_name"),
                              email = ReadField(record, "email"),
                              business_phone = ReadField(record, "business_phone"),
                              mobile_phone = ReadField(record, "mobile_phone"),
                              home_phone = ReadField(record, "home_phone"),
                              address = ReadField(record, "address"),
                              address2 = ReadField(record, "address2"),
                              city = ReadField(record, "city"),
                              state = ReadField(record, "state"),
                              zip = ReadField(record, "zip"),
                              country = ReadField(record, "country")
                          });

            return list;
        }


        private static string ReadField(XmlNode node, string nodeName)
        {
            var selectSingleNode = node.SelectSingleNode("field[@name = '" + nodeName + "']");
            if (selectSingleNode != null && selectSingleNode.Attributes != null)
                return selectSingleNode.Attributes["value"].Value;

            return string.Empty;
        }
    }
2
  • Have you try using Deserialize method of XmlSerializer class. You only need one line (apart from your class definition) to deserialize the xml into you data structure. Commented May 24, 2015 at 9:39
  • I like your idea but can you suggest me how it fit in this example? Commented May 24, 2015 at 21:17

3 Answers 3

2

Here's how you deserialize it into your class structure

Reference xml namespace

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

deserialize

        string input =
            "<result>\n" +
               "<record>" +
                   "<field name=\"donor_id\" id=\"donor_id\" value=\"9879\" />" +
                   "<field name=\"first_name\" id=\"first_name\" value=\"Trix5647\" />" +
                   "<field name=\"last_name\" id=\"last_name\" value=\"Rabbit657\" />" +
                   "<field name=\"email\" id=\"email\" value=\"[email protected]\" />" +
                   "<field name=\"business_phone\" id=\"business_phone\" value=\"\" />" +
                   "<field name=\"mobile_phone\" id=\"mobile_phone\" value=\"\" />" +
                   "<field name=\"home_phone\" id=\"home_phone\" value=\"\" />" +
                   "<field name=\"address\" id=\"address\" value=\"Street S.W. \" />" +
                   "<field name=\"address2\" id=\"address2\" value=\"\" />" +
                   "<field name=\"city\" id=\"city\" value=\"Quaker\" />" +
                   "<field name=\"state\" id=\"state\" value=\"PA\" />" +
                   "<field name=\"zip\" id=\"zip\" value=\"1234\" />" +
                   "<field name=\"country\" id=\"country\" value=\"USA\" />" +
               "</record>" +
           "</result>";

        XmlSerializer serializer = new XmlSerializer(typeof(Result));
        Result result = serializer.Deserialize(new System.IO.StringReader(input)) as Result;

Class definition

[XmlRoot("result")]
public class Result
{
    [XmlElement("record")]
    public Record[] Records { get; set; }
}

public class Record
{
    [XmlElement("field")]
    public Field[] Fields { get; set; }
}

public class Field
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlAttribute("id")]
    public string Id { get; set; }

    [XmlAttribute("value")]
    public string Value { get; set; }
}
Sign up to request clarification or add additional context in comments.

Comments

0

Here is an interesting solution

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<result>" +
                   "<record>" +
                       "<field name=\"donor_id\" id=\"donor_id\" value=\"9879\" />" +
                       "<field name=\"first_name\" id=\"first_name\" value=\"Trix5647\" />" +
                       "<field name=\"last_name\" id=\"last_name\" value=\"Rabbit657\" />" +
                       "<field name=\"email\" id=\"email\" value=\"[email protected]\" />" +
                       "<field name=\"business_phone\" id=\"business_phone\" value=\"\" />" +
                       "<field name=\"mobile_phone\" id=\"mobile_phone\" value=\"\" />" +
                       "<field name=\"home_phone\" id=\"home_phone\" value=\"\" />" +
                       "<field name=\"address\" id=\"address\" value=\"Street S.W. \" />" +
                       "<field name=\"address2\" id=\"address2\" value=\"\" />" +
                       "<field name=\"city\" id=\"city\" value=\"Quaker\" />" +
                       "<field name=\"state\" id=\"state\" value=\"PA\" />" +
                       "<field name=\"zip\" id=\"zip\" value=\"1234\" />" +
                       "<field name=\"country\" id=\"country\" value=\"USA\" />" +
                   "</record>" +
                  "<record>" +
                       "<field name=\"donor_id\" id=\"donor_id\" value=\"9879\" />" +
                       "<field name=\"first_name\" id=\"first_name\" value=\"Trix5647\" />" +
                       "<field name=\"last_name\" id=\"last_name\" value=\"Rabbit657\" />" +
                       "<field name=\"email\" id=\"email\" value=\"[email protected]\" />" +
                       "<field name=\"business_phone\" id=\"business_phone\" value=\"\" />" +
                       "<field name=\"mobile_phone\" id=\"mobile_phone\" value=\"\" />" +
                       "<field name=\"home_phone\" id=\"home_phone\" value=\"\" />" +
                       "<field name=\"address\" id=\"address\" value=\"Street S.W. \" />" +
                       "<field name=\"address2\" id=\"address2\" value=\"\" />" +
                       "<field name=\"city\" id=\"city\" value=\"Quaker\" />" +
                       "<field name=\"state\" id=\"state\" value=\"PA\" />" +
                       "<field name=\"zip\" id=\"zip\" value=\"1234\" />" +
                       "<field name=\"country\" id=\"country\" value=\"USA\" />" +
                   "</record>" +
               "</result>";

            XDocument doc = XDocument.Parse(input);


            var listDict = doc.Descendants("record").AsEnumerable()
                .Select(x => x.Descendants("field")
                .GroupBy(y => y.Attribute("name").Value, z => z.Attribute("value").Value)
                .ToDictionary(y => y.Key, z => z.FirstOrDefault())
                .ToList());



        }
    }
}

​

Comments

0

A solution more like your original

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<result>" +
                   "<record>" +
                       "<field name=\"donor_id\" id=\"donor_id\" value=\"9879\" />" +
                       "<field name=\"first_name\" id=\"first_name\" value=\"Trix5647\" />" +
                       "<field name=\"last_name\" id=\"last_name\" value=\"Rabbit657\" />" +
                       "<field name=\"email\" id=\"email\" value=\"[email protected]\" />" +
                       "<field name=\"business_phone\" id=\"business_phone\" value=\"\" />" +
                       "<field name=\"mobile_phone\" id=\"mobile_phone\" value=\"\" />" +
                       "<field name=\"home_phone\" id=\"home_phone\" value=\"\" />" +
                       "<field name=\"address\" id=\"address\" value=\"Street S.W. \" />" +
                       "<field name=\"address2\" id=\"address2\" value=\"\" />" +
                       "<field name=\"city\" id=\"city\" value=\"Quaker\" />" +
                       "<field name=\"state\" id=\"state\" value=\"PA\" />" +
                       "<field name=\"zip\" id=\"zip\" value=\"1234\" />" +
                       "<field name=\"country\" id=\"country\" value=\"USA\" />" +
                   "</record>" +
                  "<record>" +
                       "<field name=\"donor_id\" id=\"donor_id\" value=\"9879\" />" +
                       "<field name=\"first_name\" id=\"first_name\" value=\"Trix5647\" />" +
                       "<field name=\"last_name\" id=\"last_name\" value=\"Rabbit657\" />" +
                       "<field name=\"email\" id=\"email\" value=\"[email protected]\" />" +
                       "<field name=\"business_phone\" id=\"business_phone\" value=\"\" />" +
                       "<field name=\"mobile_phone\" id=\"mobile_phone\" value=\"\" />" +
                       "<field name=\"home_phone\" id=\"home_phone\" value=\"\" />" +
                       "<field name=\"address\" id=\"address\" value=\"Street S.W. \" />" +
                       "<field name=\"address2\" id=\"address2\" value=\"\" />" +
                       "<field name=\"city\" id=\"city\" value=\"Quaker\" />" +
                       "<field name=\"state\" id=\"state\" value=\"PA\" />" +
                       "<field name=\"zip\" id=\"zip\" value=\"1234\" />" +
                       "<field name=\"country\" id=\"country\" value=\"USA\" />" +
                   "</record>" +
               "</result>";

            List<dp_donorsearch> list = dp_donorsearch.Load(input);


        }
        public class dp_donorsearch
        {
            public string donor_id { get; set; }
            public string first_name { get; set; }
            public string last_name { get; set; }
            public string email { get; set; }
            public string business_phone { get; set; }
            public string mobile_phone { get; set; }
            public string home_phone { get; set; }
            public string address { get; set; }
            public string address2 { get; set; }
            public string city { get; set; }
            public string state { get; set; }
            public string zip { get; set; }
            public string country { get; set; }

            public static List<dp_donorsearch> Load(string input)
            {
                List<dp_donorsearch> list = new List<dp_donorsearch>();
                XDocument doc = XDocument.Parse(input);

                var listDict = doc.Descendants("record").AsEnumerable()
                    .Select(x => new
                    {
                        dict = x.Descendants("field")
                            .GroupBy(y => y.Attribute("name").Value, z => z.Attribute("value").Value)
                            .ToDictionary(y => y.Key, z => z.FirstOrDefault())
                    });

                foreach(var dict in listDict)
                {
                    dp_donorsearch newDp = new dp_donorsearch();
                    list.Add(newDp);

                    newDp.donor_id = dict.dict["donor_id"];
                    newDp.first_name = dict.dict["first_name"];
                    newDp.last_name = dict.dict["last_name"];
                    newDp.email = dict.dict["email"];
                    newDp.business_phone = dict.dict["business_phone"];
                    newDp.mobile_phone = dict.dict["mobile_phone"];
                    newDp.home_phone = dict.dict["home_phone"];
                    newDp.address = dict.dict["address"];
                    newDp.address2 = dict.dict["address2"];
                    newDp.city = dict.dict["city"];
                    newDp.state = dict.dict["state"];
                    newDp.zip = dict.dict["zip"];
                    newDp.country = dict.dict["country"];
                }

                return list;
            }



        }
    }
}
​

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.