我继承了一个项目,无法与/或不知道原始开发人员提出这个问题。这是一个.NET MVC项目。
这是我第一次使用ExpandoObject,所以我正在努力学习。我遵循最初使用的样式,其中信息被添加到xml文件,然后解析并存储在Model
中。当我调试问题并检查视图中的Model
时,我只看到我在XML中拥有的两个值。
这是我在文件末尾附加的XML:
<Home_Index> <NewsletterSignup>
<SignUpMessage>
<Copy>
<![CDATA[
Want up to $20 in savings?
]]>
</Copy>
</SignUpMessage>
<SignUpMessage>
<Copy>
<![CDATA[
Sign up, stay connected & save up to $20.
]]>
</Copy>
</SignUpMessage>
</NewsletterSignup>
</Home_Index>
因此,当我检查Model
时,我看到的只是第二个<SignUpMessage>
,而不是第一个。{/ p>
以下是创建ExpandoObject的代码:
public class XmlToDynamic
{
public static dynamic Parse(String file, XElement node = null)
{
if (String.IsNullOrWhiteSpace(file) && node == null) return null;
node = !String.IsNullOrWhiteSpace(file) ? XDocument.Load(System.Web.Hosting.HostingEnvironment.MapPath(file)).Root : node;
IDictionary<String, dynamic> result = new ExpandoObject();
var pluralizationService = PluralizationService.CreateService(CultureInfo.CreateSpecificCulture("en-us"));
node.Elements().ForEach(gn =>
{
var isCollection = gn.HasElements &&
(
gn.Elements().Count() > 1 &&
gn.Elements().All(e => e.Name.LocalName.ToLower() == gn.Elements().First().Name.LocalName) ||
gn.Name.LocalName.ToLower() == pluralizationService.Pluralize(gn.Elements().First().Name.LocalName).ToLower()
);
var items = isCollection ? gn.Elements().ToList() : new List<XElement> { gn };
var values = new List<dynamic>();
items.ForEach(i => values.Add((i.HasElements) ? Parse(null, i) : i.Value.Trim()));
result[gn.Name.LocalName] = isCollection ? values : values.FirstOrDefault();
});
return result;
}
}
我想要做的是选择两个<SignUpMessage>
并随机选择一个来显示。
另外值得注意的是,xml文件的内容在我添加<NewsletterSignup>
之前已正确解析。
答案 0 :(得分:1)
我相信你需要一个父元素来保存你的两个SignUpMessages:
<Home_Index>
<NewsletterSignup>
<SignUpMessages>
<SignUpMessage>
<Copy>
`<![CDATA[`
Want up to $20 in savings?
`]]>`
</Copy>
</SignUpMessage>
<SignUpMessage>
<Copy>
`<![CDATA[`
Sign up, stay connected & save up to $20.
`]]>`
</Copy>
</SignUpMessage>
</SignUpMessages>
</Home_Index>
</NewsletterSignup>
Home_Index和NewsletterSignup的未闭合标签也引起关注,因此我已将其关闭。