在下面的linq to xml查询中,我有2个属性list<string>
,DefaultValues和Values。
如果这些元素中的任何一个为空,我想将LiteValueParameter
对象的该属性设置为一个新的空列表:
Values = new List<string>();
相反,linq查询给了我一些东西:
Values = new List<string>();
Values.Add("");
如果我的XML中有空元素,有没有办法阻止将空项添加到列表中?
Linq代码:
//linq query
List<LiteValueParameter> valParams = new List<LiteValueParameter>();
valParams = (from c in doc.Descendants("Parameters").Descendants("Parameter")
where (LiteParameterType)Enum.Parse(typeof(LiteParameterType), c.Element("ParameterType").Value, true) == LiteParameterType.Value
select new LiteValueParameter()
{
Id = c.Attribute("Id").Value,
DataType = Type.GetType(c.Element("DataType").Value, true),
DefaultValues = c.Elements("DefaultValues").Select(element => element.Value).ToList(),
DisplayText = c.Element("DisplayText").Value,
IsRequired = Convert.ToBoolean(c.Element("IsRequired").Value),
MinCount = Convert.ToInt32(c.Element("MinCount").Value),
MaxCount = Convert.ToInt32(c.Element("MaxCount").Value),
MinValue = c.Element("MinValue").Value,
MaxValue = c.Element("MaxValue").Value,
ParameterName = c.Element("ParameterName").Value,
Values = c.Elements("Values").Select(element => element.Value).ToList(),
ParameterType = (LiteParameterType)Enum.Parse(typeof(LiteParameterType), c.Element("ParameterType").Value, true),
DisplayType = c.Element("DisplayType").Value
}).ToList();
XML代码:
<Parameters>
<Parameter Id="PermissionList">
<ParameterType>Value</ParameterType>
<ParameterName>Permissions</ParameterName>
<DisplayType>ListBox</DisplayType>
<DisplayText>Permissions</DisplayText>
<IsRequired>true</IsRequired>
<MinValue />
<MaxValue />
<DefaultValues />
<Values />
<DataType>System.String</DataType>
<MinCount>1</MinCount>
<MaxCount>1</MaxCount>
</Parameter>
</Parameters>
答案 0 :(得分:4)
我想你可以像这样解决它:
DefaultValues = (c.Elements("DefaultValues").Count() == 1 && c.Elements("DefaultValues").First().Value == string.Empty) ? new List<string>() :
c.Elements("DefaultValues").Select(element => element.Value).ToList(),
但这种方法感觉非常“hacky”。相反,我会将您的XML更改为具有您查询的DefaultValue
元素:
<DefaultValues>
<DefaultValue>Foo</DefaultValue>
</DefaultValues>
这更自然,现在您可以像
一样编写查询DefaultValues = c.Descendants("DefaultValue").Select(element => element.Value).ToList(),
如果你有
,这将返回一个空集合<DefaultValues/>