Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用可选元素从XML创建列表_C#_Xml_Linq - Fatal编程技术网

C# 使用可选元素从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

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

,, , ,

守则:

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;