【问题标题】:C# Reading from a custom fileC# 从自定义文件中读取
【发布时间】:2010-10-26 13:19:05
【问题描述】:

好的,我已经读到 .INI 文件现在已经过时了,.NET Framework 创建者希望我们使用 .XML 文件。但是,我觉得我的一些用户很难使用 .XML 文件,所以我想创建一个自定义配置文件。

我有一个包含 3 个参数的列表字符串(实际上是 Scintilla 中的 sn-p 函数),如下所示:

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

现在我想插入用户可以自己添加的文件中的所有 sn-ps,包括名称、代码和字符,但我不知道该怎么做。可能是这样的:

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

但是我不知道如何以这种方式读取这些值。如果有人能告诉我一种从文件中读取 sn-ps 的有效方法,我将不胜感激。

【问题讨论】:

  • 我认为这对您的用户来说可能比 .XML 文件更难。
  • 你的问题是哪一部分?从文件中读取?将每一行分割成三个参数?用户在一行中只放两个单词时的错误处理?
  • 好吧,那我想我会坚持使用 XML 文件。我的问题是我不知道这样做的“好”方法,但我现在可能只使用 XML 文件。
  • 括号是元素的一部分吗?示例的测试是否会编码为[Name] [Code] [char]
  • 要阅读 XML,只需选择一个随机的 SO 问题作为提示,例如:stackoverflow.com/questions/4023600/… 我会选择 XmlSerializer 方法(可能也创建一个 XSD),但 Linq2XML 的工作同样简单。

标签: c# file code-snippets config


【解决方案1】:

正如其他人所建议的,与@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));

【讨论】:

    【解决方案2】:

    如果你更喜欢 ini 文件,我读过关于 Nini 的好东西

    【讨论】:

      【解决方案3】:

      为什么不直接在你谈到的 xml 中设置你的 sn-ps,然后用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;  
      
          }
      }
      

      【讨论】:

      • 关于这个的问题。在处理 .XML 文件时,我如何将 sn-ps 实际添加到列表中?
      • 呵呵,谢谢,虽然我自己也弄明白了。不过感谢您给我这个想法,真的很感激;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多