遍历配置文件中的路径列表

本文关键字:路径 列表 配置文件 遍历 | 更新日期: 2023-09-27 18:06:58

我有一个控制台应用程序,其中有几个foreach循环,迭代路径并从csv文件解析出电子邮件地址。但是,我需要我的循环从配置文件中读取,而不是遍历目录,然后最终为每个电子邮件地址调用现有的API端点。这是我现在的代码:

 static void RunTask(string[] args)
        {
            foreach (string folders in Directory.EnumerateDirectories("C:''tests"))//looks at every folder within this main folder called tests --this needs to read the list of paths
            {
                foreach (string path in Directory.EnumerateFiles(folders, "*.csv"))//looks at every file with the extension ".csv" in each folder
                {
                    Debug.Write("'n" + path + "'n"); //writes out file names
                    using (StreamReader sr = new StreamReader(path))
                    {
                        String line;
                        while ((line = sr.ReadLine()) != null)
                        {
                            string[] parts = line.Split(',');
                            string email = parts[1];
                            Debug.Write(email + "'n");//writes out email column
                        }
                    }
                }
            }
        }

这就是我的路径。配置文件:

<pathsSettings>
  <paths>
    <add Path="C:'tests'first" 
         TemplateId="123456">
    </add>
    <add Path="C:'tests'second"
         TemplateId="tem_56hyNijCXxGP52ZrgdWziC ">
    </add>
    <add Path="C:'tests'third"
         TemplateId="tem_2wWT6YfGkDXSntEPKhHCWB ">
    </add>
  </paths>
</pathsSettings>

我不确定我应该如何写我的foreach从这些路径的列表中绘制。

遍历配置文件中的路径列表

 public class PathTemplate
 {
     public string path { get; set; }
     public string template { get; set; }
 }
  public static string getxml()
    {
        return "<pathsSettings>" +
               "<paths>" +
               "<add Path='"C:''tests''first'" TemplateId='"123456'"></add>" +
               "<add Path='"C:''tests''second'" TemplateId='"tem_56hyNijCXxGP52ZrgdWziC '"></add>" +
               "<add Path='"C:''tests''third'" TemplateId='"tem_2wWT6YfGkDXSntEPKhHCWB '"></add>" +
               "</paths>" +
               "</pathsSettings>";
    }

var xdoc = XDocument.Parse(getxml());
        Console.WriteLine(xdoc);
        var pts = xdoc.Elements("pathsSettings")
            .Elements("paths")
            .Elements("add").
            Select(p => new PathTemplate()
            {
                path = p.Attribute("Path").Value.ToString(),
                template = p.Attribute("TemplateId").Value.ToString()
            }).ToList();

这对我有用:

var doc = XDocument.Parse(@"<pathsSettings>
  <paths>
    <add Path=""C:'tests'first"" 
         TemplateId=""123456"">
    </add>
    <add Path=""C:'tests'second""
         TemplateId=""tem_56hyNijCXxGP52ZrgdWziC "">
    </add>
    <add Path=""C:'tests'third""
         TemplateId=""tem_2wWT6YfGkDXSntEPKhHCWB "">
    </add>
  </paths>
</pathsSettings>");
var paths =
    doc
        .Root
        .Descendants("add")
        .Select(e => e.Attribute("Path").Value)
        .ToList();

给了我这些路径列表:

C:'tests'first 
C:'tests'second 
C:'tests'third 

如果对象正确,则可以对xml进行反序列化。我认为你的类应该是这样的:

[Serializable()]
public class add
{
    [System.Xml.Serialization.XmlAttribute("Path")]
    public string Path { get; set; }
    [System.Xml.Serialization.XmlAttribute("TemplateId")]
    public string TemplateId { get; set; }
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("pathsSettings")]
public class pathsSettings
{
    [XmlArray("paths")]
    [XmlArrayItem("add", typeof(add))]
    public add[] paths { get; set; }
}

你可以像这样遍历

public void DoWhatever(){
        pathsSettings myObject;
        // Construct an instance of the XmlSerializer with the type
        // of object that is being deserialized.
        XmlSerializer mySerializer = new XmlSerializer(typeof(pathsSettings));
        // To read the file, create a FileStream.
        FileStream myFileStream = new FileStream(@"yourpath'Path.config", FileMode.Open);
        // Call the Deserialize method and cast to the object type.
        myObject = (pathsSettings)mySerializer.Deserialize(myFileStream);
        foreach(add addObj in myObject.paths)
        {
            Console.WriteLine(addObj.Path);
            Console.WriteLine(addObj.TemplateId);
        }
}

这个方法要求你有正确的对象,但在长期运行中,你可以使用这些对象来序列化你的值,如果需要的话,所以编辑你的配置文件。如果你还需要你的TemplateId,那么你已经在你的"add" Object

中添加了它