我正在使用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路径时都添加代码?
答案 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);
}
}