2012-01-10 3 views
1

У меня есть файл XML, который находится в папке/bin (с помощью vs2010). Я хотел бы извлечь некоторые данные (атрибуты, значения элементов) из этого xml. Каков наилучший способ сделать это с помощью C#?Извлечение данных из XML-файла с использованием C#

мне нужно использовать XmlTextReader или было бы лучше создать XMLDOCUMENT ... Я запутался ...

ответ

0

Вот простой пример запроса к XML-файла

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

} 

Фрагмент из XML-файла:

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

класса, который заполняет объекты работы с XML-файла

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(); 
    } 

} 
0

Я бы порекомендовал вам проверить Serialization аут. Вот небольшой пример того, как для сериализации/десериализации XML в/из объекта с помощью ek_ny XML документа:

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

Реализация:

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"); 
     } 
    } 

При этом вы получите объект назад и вперед от и к XML. Это то, что сработало лучше для меня. Единственные минусы, которые я вижу здесь, это то, что если ваш XML-документ обладает множеством свойств, вам придется сделать очень большой класс.

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

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

Успехов!

0

Есть один хороший способ сделать это. Вы можете использовать DataTable.ReadXml(string fileName) он заботится обо всем легко. В зависимости от проблемы это может быть полезно или нет. Обратите внимание, что эти методы не могут получить схему из XML-файла, вы должны добавить столбцы в таблицу самостоятельно.

Смежные вопросы