我正在处理一些XML文档并尝试将它们解析为列表。 我已经阅读了以下答案和文章但是,我找不到一种方法来解析可选的“Values”标签及其下面代码的元素。
http://blogs.msdn.com/b/ericwhite/archive/2009/05/14/working-with-optional-elements-and-attributes-in-linq-to-xml-queries.aspx, LINQ to XML optional element query, Can 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中可选“值”标记的代码?
答案 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;