使用可选元素从XML创建列表

时间:2014-06-18 08:44:23

标签: c# xml linq

我正在处理一些XML文档并尝试将它们解析为列表。 我已经阅读了以下答案和文章但是,我找不到一种方法来解析可选的“Values”标签及其下面代码的元素。

http://blogs.msdn.com/b/ericwhite/archive/2009/05/14/working-with-optional-elements-and-attributes-in-linq-to-xml-queries.aspxLINQ to XML optional element queryCan XML with optional elements be used with LINQ and Anonymous Types?How to Parse Optional or Null XML Elements & Attributes with LINQ?

代码:

XDocument xdoc1 = XDocument.Load("sample.xml");
List<Message> messages = new List<Message>();
messages = (from _message in xdoc1.Element("Messages").Elements("Message")
select new Message
{
    Id = _message.Element("Id").Value,
    Alias = _message.Element("Alias").Value,
    Fields = (from _field in _message.Element("Fields").Elements("Field")
        select new Field
        {
            FieldName = _field.Element("FieldName").Value,
            StartIndex = Convert.ToInt16(_field.Element("StartIndex").Value),
            StopIndex = Convert.ToInt16(_field.Element("StopIndex").Value),
            DefaultBits = _field.Element("DefaultBits").Value,
            CalculationMethod = (CalculationMethods.Types)Enum.Parse(typeof(CalculationMethods.Types), _field.Element("CalculationMethod").Value),
            Values = (from _value in _field.Element("Values").Elements("Value")
                select new Value
                {
                    Bits = _value.Element("Bits").Value,
                    Meaning = _value.Element("Meaning").Value
                }).ToList()
        }).ToList()
}).ToList();

某些“字段”的“字段”包含“FieldName”,“StartIndex”,“StopIndex”,“DefaultBits”,“CalculationMethod”以及可选的“值”。如何修复XML中可选“值”标记的代码?

2 个答案:

答案 0 :(得分:0)

不使用.Value,而是使用XElement中的显式转化。例如:

FieldName = (string) _field.Element("FieldName"),
StartIndex = (short?) _field.Element("StartIndex")

对于缺席元素,您最终会得到空值,因为当操作数为null时,XElement上的自定义转换会起作用(并且返回类型是引用类型或者可空值类型)。

对于Values,它更加容易 - 您只需将_field.Element("Values")更改为_field.Elements("Values")

Values = (from _value in _field.Elements("Values").Elements("Value")
          select new Value
          {
              Bits = _value.Element("Bits").Value,
              Meaning = _value.Element("Meaning").Value
          }).ToList()

这样,如果没有_field.Elements("Values")元素,Values将返回一个空序列。

答案 1 :(得分:0)

你可以在linq中使用条件运算符。

FieldName = _field.Element("FieldName")!=null?_field.Element("FieldName").Value:string.Empty;