使用xml文件作为选项文件

时间:2018-07-20 13:00:28

标签: c# xml

我正在使用Windows服务,该服务使用xml作为选项文件来监视目录,当在其中检测到新文件时,该文件将被重命名,通过邮件发送到指定的用户列表并移至存档目录。

选项文件以前是这样的,用户每次都将替换为他需要的文件:

<Options>
    <ExportDir>path/to/export/directory</ExportDir>
    <ArchiveDir>path/to/archive/directory</ArchiveDir>
    <MailTo>
        <Mail>fake1@mail.com</Mail>
        <Mail>fake2@mail.com</Mail>
        <Mail>fake3@mail.com</Mail>
    </MailTo>
</Options>

使用:

List<string> mail = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load(@"path/to/xml/file");

XmlNode NodeExportDir = doc.DocumentElement.SelectSingleNode("ExportDir");
string ExportDir= NodeExportDir.InnerText;

XmlNode NodeArchiveDir = doc.DocumentElement.SelectSingleNode("ArchiveDir");
string ArchiveDir = NodeArchiveDir.InnerText;

XmlNodeList listAddress = doc.SelectNodes("//MailTo");
foreach (XmlNode node in listAddress)
{
    foreach (XmlNode mailAddress in node.ChildNodes)
    {
        mail.Add(mailAddress.InnerText);
    }
}

我想对其进行改进,以便可以有多个选择而不必每次都删除。因此,xml文件现在看起来像:

<Options>
    <ExportDir path = "path/to/export/directory">
        <ArchiveDir>path/to/archive/directory</ArchiveDir>
        <MailTo>
            <Mail>fake1@mail.com</Mail>
            <Mail>fake2@mail.com</Mail>
            <Mail>fake3@mail.com</Mail>
        </MailTo>
    </ExportDir>
    <ExportDir path = "path/to/export/directory2">
        <ArchiveDir>path/to/archive/directory2</ArchiveDir>
        <MailTo>
            <Mail>fake4@mail.com</Mail>
            <Mail>fake5@mail.com</Mail>
            <Mail>fake6@mail.com</Mail>
        </MailTo>
    </ExportDir>
</Options>

当只有一个ExportDir时,我仍然可以使用以下代码解析并将结果放入所需的变量中:

List<string> mail = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load(@"path/to/xml/file");

XmlNodeList NodeExportDir = doc.GetElementsByTagName("ExportDir");
for (int i = 0; i < NodeExportDir.Count; i++)
{
    string ExportDir = NodeExportDir[i].Attributes["path"].Value;
}

XmlNodeList NodeArchiveDir = doc.SelectNodes("//ArchiveDir");
foreach (XmlNode node in NodeArchiveDir)
{
    foreach (XmlNode dirArch in node.ChildNodes)
    {
        string ArchiveDir = dirArch.InnerText;
    }
}

XmlNodeList listAddress = doc.SelectNodes("//MailTo");
foreach (XmlNode node in listAddress)
{
    foreach (XmlNode mailAddress in node.ChildNodes)
    {
        mail.Add(mailAddress.InnerText);
    }
}

但是,如果有不止一个,那当然就不符合我的意愿了。

如何根据用户放置文件的位置(即ExportDir)使用存档目录和邮件地址。

更新:

由于ivcubr's answer,我现在可以选择与ExportDir路径相对应的信息,如下所示:

foreach (DossierExport test in options)
{
    if (test.Path == "path/to/export/directory")
    {
        string ArchiveDir = test.Archive;
        foreach (string mailAddr in test.Mail)
        {
            mail.Add(mailAddr);
        }
    }
}

我该如何制定一般解决方案,这样就不必每次在xml文件中创建新的ExportDir路径时都添加代码?

1 个答案:

答案 0 :(得分:1)

如果您对XmlDocument最满意,则应该可以使用以下方法。在这里,我建议创建一个类来保存每个选项,然后稍后您可以循环浏览所有这些选项,并使用从XML文件解析的属性。

XmlDocument doc = new XmlDocument();
doc.Load(@"test.xml");

List<ExportDirectory> options = new List<ExportDirectory>();
XmlNodeList nodeExportDir = doc.GetElementsByTagName("ExportDir");
foreach (XmlNode node in nodeExportDir) {
    ExportDirectory exportDirectory = new ExportDirectory() {
        Path = node.Attributes["path"].Value,
        Archive = node.SelectSingleNode("ArchiveDir").InnerText
    };

    foreach (XmlNode mail in node.SelectNodes("MailTo/Mail")) {
        exportDirectory.Mail.Add(mail.InnerText);
    }
    options.Add(exportDirectory);
}

导出目录类:

public class ExportDirectory {
    public string Path { get; set; }
    public string Archive { get; set; }
    public List<string> Mail { get; set; }

    public ExportDirectory() {
        Mail = new List<string>();
    }
}

编辑:

关于您添加的问题,为什么您需要拥有if (test.Path == "path/to/export/directory")?为什么不消除if语句并继续:

foreach (DossierExport test in options)
{
    string ArchiveDir = test.Archive;
    foreach (string mailAddr in test.Mail)
    {
        mail.Add(mailAddr);
    }
}