有没有更好的方法来编写下面的程序(我相信它可以但是如何)
for (int i = 0; i < relevantElements.Count(); i++)
{
switch (len)
{
case 1: result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = null
,
EmailAddress = null
});
break;
case 2:
result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = GetElementValues(relevantElements[1], applicationType)
,
EmailAddress = null
});
break;
case 3:
result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = GetElementValues(relevantElements[1], applicationType)
,
EmailAddress = GetElementValues(relevantElements[2], applicationType)
});
break;
}
}
谢谢
编辑
我有一个源 xml 文件
<?xml version="1.0" encoding="utf-8"?>
<RootElement>
<HomeSite>
<Context enabled="1" active="1">
<Culture>en-us</Culture>
<Affiliate>0</Affiliate>
<EmailAddress>sreetest@test.com</EmailAddress>
<Password>sreesree1</Password>
</Context>
</HomeSite>
<ResourceManager>
<Context enabled="1" active="1">
<Culture>en-us</Culture>
<Affiliate>0</Affiliate>
</Context>
</ResourceManager>
<Purchase>
<Context enabled="1" active="1">
<PurchaseUrl>http://purchase.mcafee.com?culture=en-us&affid=0</PurchaseUrl>
</Context>
<Context enabled="0" active="0">
<PurchaseUrl>http://purchase.mcafee.com?culture=en-gb&affid=0</PurchaseUrl>
</Context>
</Purchase>
</RootElement>
从“HomeSite”应用类型可以看出,“Context”元素下有 3 个元素,即 Culture、Affiliate、EmailAddress。但这与其他应用程序类型“ResourceManager”和“Purchase”不同。我也有一个自定义实体,如下所示
public class ContextElements
{
public string CultureName { get; set; }
public string AffId { get; set; }
public string EmailAddress { get; set; }
}
挑战是我必须在运行时填写属性值。不能超过 3 个。
我的完整程序(但需要改进代码)
class Program
{
static void Main(string[] args)
{
XDocument xmlSkuDescDoc = null;
xmlSkuDescDoc = XDocument.Load(@"D:\Config.xml");
string applicationType = ApplicationType.Purchase.ToString();
var result = new List<ContextElements>();
var elementCollection = new List<string>();
(from data in xmlSkuDescDoc.Descendants(applicationType)
select data)
.Descendants("Context")
.Elements()
.ToList()
.ForEach(i => elementCollection.Add(i.Name.ToString()));
//Exclude unwanted elements
var relevantElements = elementCollection.Except(new List<string> { "Password" }).ToList();
int len = relevantElements.Count();
for (int i = 0; i < relevantElements.Count(); i++)
{
switch (len)
{
case 1: result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = null
,
EmailAddress = null
});
break;
case 2:
result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = GetElementValues(relevantElements[1], applicationType)
,
EmailAddress = null
});
break;
case 3:
result.Add(new ContextElements
{
CultureName = GetElementValues(relevantElements[0], applicationType)
,
AffId = GetElementValues(relevantElements[1], applicationType)
,
EmailAddress = GetElementValues(relevantElements[2], applicationType)
});
break;
}
}
// //just for printing
result.ForEach(i => Console.WriteLine(string.Format("CultureName = {0} , AffId = {1} , EmailAddress = {2} ", i.CultureName, i.AffId, i.EmailAddress)));
Console.ReadKey();
}
private static string GetElementValues(string elementName,string applicationType)
{
XDocument xmlSkuDescDoc = null;
xmlSkuDescDoc = XDocument.Load(@"D:\Config.xml");
return (from data in
(from data in xmlSkuDescDoc.Descendants(applicationType)
select data).Descendants("Context")
select new { Value = (string)data.Element(elementName)}).FirstOrDefault().ToString();
}
public enum ApplicationType
{
HomeSite = 1
,
ResourceManager
,
ApplicationProvisioning
,
Purchase
,
GAC
, WebSVCService
}
}