C # Чтение из пользовательского файла - PullRequest
0 голосов
/ 26 октября 2010

Хорошо, я прочитал, что файлы .INI устарели, и создатели .NET Framework хотят, чтобы мы использовали файлы .XML. Однако я чувствую, что некоторым моим пользователям будет трудно использовать файлы .XML, поэтому я подумал о создании пользовательского файла конфигурации.

У меня есть строка списка, которая имеет 3 параметра (на самом деле это функция сниппета в Scintilla), например:

Snippet.Insert("Name", "Code", 'char');

Теперь я хочу вставить все фрагменты из файлов, которые пользователь может добавить сам, включая имя, код и символ, но я понятия не имею, как мне это сделать. Может быть что-то вроде:

[Snippet1] [Snippet1Code] [Snippet1Char]
[Snippet2] [Snippet2Code] [Snippet2Char]
[Snippet3] [Snippet3Code] [Snippet3Char]

Однако я не знаю, как бы я читал значения таким образом. Если кто-то может сказать мне эффективный способ чтения фрагментов из файла, я был бы очень благодарен.

Ответы [ 3 ]

0 голосов
/ 26 октября 2010

Как предлагали другие, и аналогично подходу @ gmcalab, здесь приведен краткий пример использования Linq To XML .

public class Snippet
{
    public string Name { get; set; }
    public string Code { get; set; }
    public char Character { get; set; }
}


XDocument doc = XDocument.Parse(@"<snippets>
                                  <snippet name='snippet1' character='a'> 
                                     <![CDATA[ 
                                       // Code goes here  
                                       ]]>
                                  </snippet>
                                  <snippet name='snippet2' character='b'> 
                                    <![CDATA[ 
                                       // Code goes here
                                        ]]> 
                                  </snippet>
                                </snippets>");

List<Snippet> snippetsList = (from snippets in doc.Descendants("snippet")
                             select new Snippet
                             {
                                 Name = snippets.Attribute("name").Value,
                                 Character = Convert.ToChar(snippets.Attribute("character").Value),
                                 Code = snippets.Value
                             }).ToList();

snippetsList.ForEach(s => Console.WriteLine(s.Code));
0 голосов
/ 26 октября 2010

Если вы предпочитаете INI-файлы, я прочитал хорошие вещи о Nini

0 голосов
/ 26 октября 2010

Почему бы просто не настроить свои фрагменты в xml, о котором вы говорили, а затем прочитать их с XMLTextReader?

Довольно прямо ...

<snippets>

  <snippet name="Name1" char="a">
    <snippetCode>
      for(int i = 0; i < 10; i++) { // do work }
    </snippetCode>
  </snippet>

  <snippet name="Name2" char="b">
    <snippetCode>
      foreach(var item in items) { // do work }
    </snippetCode>
  </snippet>

</snippets>

C #

public class Snippet
{
    public string Name {get;set;}
    public char Char { get; set;}
    public string Value { get; set;}
}   

List<Snippet> Snippets = new List<Snippet>();

XmlTextReader reader = new XmlTextReader ("snippets.xml");

Snippet snippet = new Snippet();

while (reader.Read()) 
{
    // Do some work here on the data.
    switch (reader.NodeType) 
    {
        case XmlNodeType.Element: 

        if(reader.Name == "snippet"){

           while (reader.MoveToNextAttribute())
           {
              if(reader.Name == "Name"){
                 // get name attribute value
                 snippet.Name = reader.Value;
              }
              else if(reader.Name == "Char"){
                 // get char attribute value
                 snippet.Char = Char.Parse(reader.Value);
              }

           } 
        } 

        break;

        case XmlNodeType.Text: //Display the text in each element.
           //Here we get the actual snippet code
           snippet.Value = reader.Value; 

        break;

        case XmlNodeType. EndElement:

            if(reader.Name == "snippet"){
               // Add snippet to list
               Snippets.Add(snippet);
               // Create a new Snippet object
               snippet = new Snippet();
            }

        break;  

    }
}
...