【发布时间】:2010-03-25 17:46:06
【问题描述】:
我有一个深度为 4 的 XML 结构:
<?xml version="1.0" encoding="utf-8"?>
<EmailRuleList xmlns:xsd="EmailRules.xsd">
<TargetPST name="Tech Communities">
<Parse emailAsList="true" useJustDomain="false" fromAddress="false" toAddress="true">
<EmailRule address="@aspadvice.com" folder="Lists, ASP" saveAttachments="false" />
<EmailRule address="@sqladvice.com" folder="Lists, SQL" saveAttachments="false" />
<EmailRule address="@xmladvice.com" folder="Lists, XML" saveAttachments="false" />
</Parse>
<Parse emailAsList="false" useJustDomain="false" fromAddress="false" toAddress="true">
<EmailRule address="northcoloradoarchitects@googlegroups.com" folder="Special Interest Groups|Northern Colorado Architects Group" saveAttachments="false" />
<EmailRule address="spambayes@python.org" folder="Support|SpamBayes" saveAttachments="false" />
</Parse>
<Parse emailAsList="false" useJustDomain="false" fromAddress="true" toAddress="false">
<EmailRule address="support@godaddy.com" folder="Support|GoDaddy" saveAttachments="false" />
<EmailRule address="renew@no-ip.com" folder="Support|No-IP.com" saveAttachments="false" />
<EmailRule address="discuss@orchardproject.net" folder="Discussions|Orchard Project" saveAttachments="false" />
</Parse>
<Parse emailAsList="false" useJustDomain="true" fromAddress="true" toAddress="false">
<EmailRule address="@agilejournal.com" folder="Newsletters|Agile Journal" saveAttachments="false"/>
<EmailRule address="@axosoft.ccsend.com" folder="Newsletters|Axosoft Newsletter" saveAttachments="false"/>
<EmailRule address="@axosoft.com" folder="Newsletters|Axosoft Newsletter" saveAttachments="false"/>
<EmailRule address="@cmcrossroads.com" folder="Newsletters|CM Crossroads" saveAttachments="false" />
<EmailRule address="@urbancode.com" folder="Newsletters|Urbancode" saveAttachments="false" />
<EmailRule address="@urbancode.ccsend.com" folder="Newsletters|Urbancode" saveAttachments="false" />
<EmailRule address="@Infragistics.com" folder="Newsletters|Infragistics" saveAttachments="false" />
<EmailRule address="@zdnet.online.com" folder="Newsletters|ZDNet Tech Update Today" saveAttachments="false" />
<EmailRule address="@sqlservercentral.com" folder="Newsletters|SQLServerCentral.com" saveAttachments="false" />
<EmailRule address="@simple-talk.com" folder="Newsletters|Simple-Talk Newsletter" saveAttachments="false" />
</Parse>
</TargetPST>
<TargetPST name="[Sharpen the Saw]">
<Parse emailAsList="false" useJustDomain="false" fromAddress="false" toAddress="true">
<EmailRule address="rmiug-jobs@yahoogroups.com" folder="Head Geek|Job Alerts" saveAttachments="false" />
<EmailRule address="inkedinusmc@yahoogroups.com" folder="Social|LinkedIn USMC" saveAttachments="false"/>
</Parse>
<Parse emailAsList="false" useJustDomain="false" fromAddress="true" toAddress="false">
<EmailRule address="JobAlerts@CyberCoders.com" folder="Head Geek|Job Alerts" saveAttachments="false" />
<EmailRule address="jobs@dice.com" folder="Head Geek|Job Alerts" saveAttachments="false" />
<EmailRule address="news@cruisecritic.com" folder="Social|Cruise Critic" saveAttachments="false"/>
</Parse>
<Parse emailAsList="false" useJustDomain="true" fromAddress="true" toAddress="false">
<EmailRule address="@moody.edu" folder="Social|5 Love Languages" saveAttachments="false" />
<EmailRule address="@postmaster.twitter.com" folder="Social|Twitter" saveAttachments="false"/>
<EmailRule address="@diabetes.org" folder="Physical|American Diabetes Association" saveAttachments="false"/>
<EmailRule address="@membership.webshots.com" folder="Social|Webshots" saveAttachments="false"/>
</Parse>
</TargetPST>
</EmailRuleList>
现在,我有一个从传入电子邮件解析的 FromAddress 和一个 ToAddress。我想对从此 XML 反序列化的类集进行 LINQ 查询。例如: ToAddress = asp@aspadvice.com FromAddress = keithb@sol3.net
查询:
- 获取 EmailRule.Include(Parse).Include(TargetPST) where address == ToAddress AND Parse.ToAddress==true AND Parse.useJustDomain==false
- 获取 EmailRule.Include(Parse).Include(TargetPST) where address == [ToAddress Domain Only] AND Parse.ToAddress==true AND Parse.useJustDomain==true
- 获取 EmailRule.Include(Parse).Include(TargetPST) where address == FromAddress AND Parse.FromAddress==true AND Parse.useJustDomain==false
- 获取 EmailRule.Include(Parse).Include(TargetPST) where address == [FromAddress Domain Only] AND Parse.FromAddress==true AND Parse.useJustDomain==true
我很难弄清楚这个 LINQ 查询。当然,我可以像这样循环 XML 中的所有位(包括反序列化为对象):
XmlSerializer s = new XmlSerializer(typeof(EmailRuleList));
TextReader r = new StreamReader(path);
_emailRuleList = (EmailRuleList)s.Deserialize(r);
TargetPST[] PSTList = _emailRuleList.Items;
foreach (TargetPST targetPST in PSTList)
{
olRoot = GetRootFolder(targetPST.name);
if (olRoot != null)
{
Parse[] ParseList = targetPST.Items;
foreach (Parse parseRules in ParseList)
{
EmailRule[] EmailRuleList = parseRules.Items;
foreach (EmailRule targetFolders in EmailRuleList)
{
}
}
}
}
但是,这意味着要为每个地址遍历所有这些循环。对我来说查询对象更有意义。任何提示表示赞赏!
【问题讨论】:
-
我不太确定我是否在关注 Keith。因此,您正在尝试获取每个与特定域匹配和/或列出的 EmailRule?
-
当我收到一封电子邮件时,收件地址或发件人地址可能匹配规则(或 2 或 3)。从那里,根据 Parse 元素中的布尔设置,我可以确定它是否是正确的运行规则。我厌倦了 Outlook 无法处理基于列表的电子邮件,并且从那以后一直在慢慢扩展它。
标签: linq-to-xml linq-to-objects