我正在创建一个C#.NET 3.5网站。在本网站中,从XML文件中读取一些内容。这个XML文件是从Excel文件中保存的,所以基本上Excel是一种内容管理系统(在这种情况下我不能使用数据库)。我正在使用LINQ to XML来获取内容对象的集合,以便我可以在webforms上使用它们。我只是从LINQ开始,但我知道分组和订购等基础知识。
我使用以下代码将内容读入集合(在本例中为视频列表):
string path = String.Format(server.MapPath("~/App_Data/Content.{0}.xml"), culture);
XDocument source = cache.Get(path);
bool boolValue = false;
var query =
from video in source.Descendants("Video")
where video.Attribute("Id").Value != null
/* Temporary values */
let featured = video.Attribute("IsFeatured").Value
select new Video
{
Culture = culture,
Id = video.Attribute("Id").Value,
Name = video.Element("Name").Value,
Description = video.Element("Description").Value,
Category = video.Element("Category").Value,
Url = video.Element("Url").Value,
IsFeatured = Boolean.TryParse(featured, out boolValue) ? boolValue : false,
Tags = video.Element("Tags").Value.Split(',').Select(t => t.Trim()).ToArray()
};
return query.ToList();
在目前的情况下,每种文化都有一个xml文件。市长的缺点是它会导致很多冗余值。为了使其更易于管理,我将只有一个xml文件。
我想创建一种情况,其中具有相同id的行共享内容,因此我不必添加冗余值。是否可以对空值进行“后退”?
示例:创建xml(excel)文件
如果我想阅读瑞士德语内容,查询将查找语言环境为“de-ch”的值。如果仍有空值,则查询将查找“更高”的区域设置,在本例中为“de”,如果仍有空值,则将从默认区域设置(即“en”)中获取它们。
假设我有一个Product对象。 它有名称,描述和价格。
以英语(en)开头
我将从文化'en'开始,因为这是我的标准文化。 在excel中我会创建一行:
然后是德语(de) 然后我想要一个德语翻译,所以我添加了另一行,但我将名称和价格留空,因为有相同的。
然后瑞士德语(de-ch) 在这里我只想加价,因为它有不同的货币。
我在LINQ中的目标
当文化被删除时,LINQ中的返回对象将具有以下值:
我想我可以在正常的C#中使用一些循环来完成它,但是你会如何在Linq中执行此操作?也许有人可以指出如何在LINQ中实现这一目标。
答案 0 :(得分:3)
为了清楚明白任何人要接受这个,我建议你通过linq将它加载到一个数据结构中来处理这种形式的后备。
与Linq可能需要的任何frankenstein方法相比,没有成本或成本很低。
根据我的经验,我没有看到任何可以做到这一点的事情。别人可能有......