简体   繁体   中英

Extracting Data From XML File Using C#

I have some XML file sitting in my /bin folder (using vs2010). I would like to extract some data (attributes, element values) from this xml. What is the best way to do this using C#?

do I need to use XMLTextReader or would it be better to create an xmlDocument...I'm confused...

Either System.Xml og System.Linq.Xml

I would recommend Linq2Xml: http://msdn.microsoft.com/en-us/library/bb387098.aspx

This is a good guide: http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

Here is a simple example of querying an XML File

public class Job
{
    public int Id { get; set; }

    public int CompanyId { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }

    public int HoursPerWeek { get; set; }

}

Snippet of XML File:

<?xml version="1.0" encoding="utf-8"?>
<Jobs>
  <Job>
    <Id>1</Id>
    <CompanyId>2</CompanyId>
    <Description>Must be willing to relocate to Nebraska.</Description>
    <HoursPerWeek>90</HoursPerWeek>
    <JobStatus>1</JobStatus>
    <JobType>3</JobType>
    <Location>NY</Location>
    <Title>Application Engineer for Gooooogle Plus</Title>
  </Job>
  <Job>

Class which populates Job objects from XML File

public class XMLJobsDAL
{

    XDocument JobDoc
    {
        get { return XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Job.xml")); }
    }


    public List<Job> GetJobs()
    {
        var results = from job in JobDoc.Descendants("Job")
                      select new Job
        {
            Id = (int)job.Element("Id"),
            CompanyId = (int)job.Element("CompanyId"),
            Description = (string)job.Element("Description"),
            HoursPerWeek = (int)job.Element("HoursPerWeek"),
            Title = (string) job.Element("Title")
        }
        return results.ToList();
    }

    public Job GetJob(int id)
    {
        var result = from job in JobDoc.Descendants("Job")
                      where (int)job.Element("Id") == id
                      select new Job
        {
            Id = (int)job.Element("Id"),
            CompanyId = (int)job.Element("CompanyId"),
            Description = (string)job.Element("Description"),
            HoursPerWeek = (int)job.Element("HoursPerWeek"),
            Title = (string) job.Element("Title")
        }
        return result.SingleOrDefault();
    }

}

I would recommend that you check Serialization out. Here is a little example of how to Serialize/Deserialize XML to/from an object using ek_ny XML Document:

using System.IO;
using System.Xml.Serialization;
[Serializable]
    public class Job
    {
        public Job() { }

        public int ID { get; set; }
        public int CompanyID { get; set; }
        public string Description { get; set; }
        public int HoursPerWeek { get; set; }
        public int JobStatus { get; set; }
        public int JobType { get; set; }
        public string Location { get; set; }
        public string Title { get; set; }

        public void SerializeToXML(string path) 
        {
            //creates a file
            FileStream fs = new FileStream(path, FileMode.Create);

            //now we create the serializer
            XmlSerializer xs = new XmlSerializer(typeof(Job));
            //serialize it to the file
            xs.Serialize(fs, this);
            //close the file
            fs.Close();
        }
        public static Job DeserializeToJob(string path) { 
            //open file
            FileStream fs = new FileStream(path, FileMode.Open);

            //create deserializer
            XmlSerializer xs = new XmlSerializer(typeof(Job));

            //Deserialize
            Job job = (Job)xs.Deserialize(fs);
            //close the file
            fs.Close();
            //return the deserialized job
            return job;
        }
    }

Implementation:

  class Program
    {
        static void Main(string[] args)
        {
            Job j = new Job();
            j.CompanyID = 2;
            j.ID = 1;
            j.Description = "Must be willing to relocate to Nebraska.";
            j.HoursPerWeek = 90;
            j.JobStatus = 1;
            j.JobType = 3;
            j.Location = "NY";
            j.Title = "Application Engineer for Gooooogle Plus";

            //Saving the object serialized.
            j.SerializeToXML("MyJob.xml");

            //deserialize the saved job into a new instance
            Job j2 = Job.DeserializeToJob("MyJob.xml");
        }
    }

With this you will get the object back and forth from and to XML. This is what has worked the best for me. The only cons I can see here is that if your XML document has a lot of properties you will have to make a very big class.

http://support.microsoft.com/kb/815813

http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

Good luck!

There's one good way to do this. You can use DataTable.ReadXml(string fileName) it takes care of everything easily. Depending on the problem, it could be useful or not. Note this methods cannot get the schema from xml file, you should add columns to the table yourself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM