linq to xml пустой список <string>элемент? - PullRequest
0 голосов
/ 03 февраля 2012

В приведенном ниже запросе 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>

1 Ответ

4 голосов
/ 03 февраля 2012

Полагаю, вы могли бы обойти это следующим образом:

DefaultValues = (c.Elements("DefaultValues").Count() == 1 && c.Elements("DefaultValues").First().Value == string.Empty) ? new List<string>() : 
c.Elements("DefaultValues").Select(element => element.Value).ToList(),

Хотя этот подход выглядит очень "хакерским".Вместо этого я бы изменил ваш XML, чтобы иметь элемент DefaultValue, который вы запрашиваете вместо:

<DefaultValues>
  <DefaultValue>Foo</DefaultValue>
</DefaultValues>

Это гораздо более естественно, и теперь вы можете просто написать свой запрос как

DefaultValues = c.Descendants("DefaultValue").Select(element => element.Value).ToList(),

Это вернет пустую коллекцию, если у вас просто есть

<DefaultValues/>
...