2009-08-26 3 views
0

У меня есть следующий XML-файл:Самый простой способ заполнения коллекции из файла XML в .NET

<?xml version="1.0" encoding="utf-8" ?> 
<scripts> 
    <ScriptName> 
    <name> 
     "My Name" 
    </ScriptName> 
    <ScriptBody> 
     "body contents" 
    </ScriptBody> 
    </script> 
</scripts> 

И следующий объект:

public class DbScript 
{ 
    #region Constructors 
    public DbScript() 
     : this(string.Empty, string.Empty) 
    { 
    } 
    public DbScript(string name, string body) 
    { 
     ScriptName = name; 
     ScriptBody = body; 
    } 
    #endregion 
    #region Properties 
    /// <summary> 
    /// Script name 
    /// </summary> 
    public string ScriptName { get; set; } 
    /// <summary> 
    /// Script body 
    /// </summary> 
    public string ScriptBody { get; set; } 
    #endregion 
} 

Что это самый быстрый способ для заполнения коллекция объекта DBScript из содержимого XML-файла? Должен ли я смотреть на сериализаторы?

Спасибо!

+0

Ваш XML не является корректным. Без хорошо сформированного XML вы не сможете многое сделать. –

ответ

3

Использование .Net Сериализация абсолютно мое предпочтение, в этом случае вы десериализации файл к объекту. Если вы берете XML (который я редактировал немного):

<?xml version="1.0" encoding="utf-8" ?> 
<scripts> 
    <script> 
    <ScriptName> 
     "My Name" 
    </ScriptName> 
    <ScriptBody> 
     "body contents" 
    </ScriptBody> 
    </script> 
</scripts> 

Затем вы создаете несколько классов представляет собой XML:

public class Scripts 
{ 

    /// <summary> 
    /// only allow xml serializer to create instances. 
    /// </summary> 
    private Scripts() 
    {   
    } 
    [XmlElement] 
    public List<script> script{ get; set; } 
} 
public class script 
{ 
    public script() 
    { 
    } 

    [XmlElement] 
    public string ScriptName { get; set; } 

    [XmlElement] 
    public string ScriptBody{ get; set; } 
} 

И тогда, когда это все настроено правильно, вы можете десериализацию файл:

string xmlFilePath = "THE_PATH_TO_THE_XML"; 
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Scripts)); 
using (XmlReader xmlReader = XmlReader.Create(xmlFilePath)) 
{ 
    Scripts scripts = (Scripts)xmlSerializer.Deserialize(xmlReader); 
} 

Xml сериализация действительно мощная, проверить его в документации: http://msdn.microsoft.com/en-us/library/ms950721.aspx.

robb

+1

-1 для использования 'XmlTextReader' вместо' XmlReader.Create' и для того, чтобы не использовать блок 'using'. –

+1

Yep XmlReader.Create - это путь, не понял. И, хороший улов на использовании заявления ... –

3

Предполагая, что вы имели в виду ввести синтаксис XML следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<scripts> 
    <script> 
    <ScriptName> 
     "My Name" 
    </ScriptName> 
    <ScriptBody> 
     "body contents" 
    </ScriptBody> 
    </script> 
</scripts> 

Затем этот код должен разобрать его. Непроверенные.

var doc = XDocument.Load("input.xml"); 
var x = from script in doc.Descendants("scripts").Descendants("script") 
     select new { 
      Name = script.Element("ScriptName").Value, 
      Body = script.Element("ScriptBody").Value 
     }; 
2
var document = XElement.Load(fileName); 
    var collection = from elem in document.Elements("script") 
        select new DBScript(
            elem.Element("ScriptName").Value, 
            elem.Element("ScriptBody").Value 
           ); 

будет делать трюк для тебя