C# 使用可选元素从XML创建列表
我正在处理一些XML文档,并试图将它们解析为列表。 我已经阅读了下面的答案和文章,但是,我找不到一种方法来解析下面代码的可选值标记及其元素 ,, , , 守则:C# 使用可选元素从XML创建列表,c#,xml,linq,C#,Xml,Linq,我正在处理一些XML文档,并试图将它们解析为列表。 我已经阅读了下面的答案和文章,但是,我找不到一种方法来解析下面代码的可选值标记及其元素 ,, , , 守则: XDocument xdoc1 = XDocument.Load("sample.xml"); List<Message> messages = new List<Message>(); messages = (from _message in xdoc1.Element("Messages").Eleme
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中可选值标记的代码?使用XElement中的显式转换,而不是使用.Value。例如:
FieldName = (string) _field.Element("FieldName"),
StartIndex = (short?) _field.Element("StartIndex")
对于缺少的元素,最终将得到null值,因为当操作数为null且返回类型为引用类型或可为null的值类型时,XElement上的自定义转换就是这样做的
对于值,它甚至更容易-您只需将_field.ElementValues更改为_field.ElementsValues:
这样,如果没有Values元素,那么_field.ElementsValues将返回一个空序列。您可以在linq中使用条件运算符
FieldName = _field.Element("FieldName")!=null?_field.Element("FieldName").Value:string.Empty;
FieldName、StartIndex等都可以,但Value下有两个子元素;比特和意义。如果字段中没有值,则字段标记和字段标记都没有。同样,您可以在位和意义上实现。您可以像这样处理位和意义的缺失,但是,在没有字段和字段标记的情况下,如何处理字段和字段标记?我不能保持当前代码的原样,因为它提供的对象引用未设置为对象的实例。值部分出错。@Cnqt:Ah,我以为您有元素值-将进行编辑。您能为这种情况提供解决方案吗?好的,谢谢。这确实有帮助。但我很好奇;在_field.ElementValues.ElementsValue中使用from_值与在_field.ElementsValues.ElementsValue中使用from_值有什么区别?@Cnqt:Element返回空引用或对单个元素的引用。元素从不返回null-它返回一系列元素,这些元素可能为空。因此,取消引用结果总是安全的,例如获取子元素。
FieldName = _field.Element("FieldName")!=null?_field.Element("FieldName").Value:string.Empty;