Xml reader错误:对象引用未设置为对象的实例

时间:2016-04-27 13:56:42

标签: c# xml

我有大量的Xml文件包含doubleintDateTimestringlists of objects等。类似的变量类型混合对此:

<?xml version="1.0" encoding="utf-8"?>
<Verification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SerialNumber>1</SerialNumber>
  <Description>V1 From File</Description>
  <DateCreated>2016-04-22T09:27:54.193</DateCreated>
  <DesiredX>1.000000</DesiredX>
  <DesiredTargets count="3">
    <Sample X1="535.108154296875" X2="1058.36315917969" Y1="780.292175292969" Y2="1037.53625488281" A="-44.5051406645421" B="-2.8002082198978" C="-0.211281331705749" DifferenceA="-44.5051406645421" DifferenceB="-2.8002082198978" DifferenceC="-0.211281331705749" ReferenceNumber="0" TimeTaken="Tuesday, April 26, 2016 2:25:43 PM" />
    <Sample X1="529.666198730469" X2="533.695007324219" Y1="854.45654296875" Y2="514.573974609375" A="62.1131427426299" B="-4.93194374266585" C="-0.383094414887779" DifferenceA="62.1131427426299" DifferenceB="-4.93194374266585" DifferenceC="-0.383094414887779" ReferenceNumber="1" TimeTaken="Tuesday, April 26, 2016 2:25:43 PM" />
    <Sample X1="172.242752075195" X2="777.789245605469" Y1="334.160064697266" Y2="740.525268554688" A="9.54891420214495" B="91.256891073657" C="0.329283687878274" DifferenceA="9.54891420214495" DifferenceB="91.256891073657" DifferenceC="0.329283687878274" ReferenceNumber="2" TimeTaken="Tuesday, April 26, 2016 2:25:45 PM" />
  </DesiredTargets>
</Verification>

对象列表的类型为Sample,默认构造函数:

public Sample(Test targetTest, double newX1, double newX2, double newY1, double newY2, double newA, double newB, double newC, int sampleNum)

Verification,每个Xml文件将被加载到它的一个实例:

public class Verification
{
    public int SerialNumber { get; set; }
    public int ReferenceCount { get; set; }
    public string Description { get; set; }
    public DateTime DateCreated {get; set; }
    public double DesiredX { get; set; }
    public List<Sample> DesiredTargets { get; set; }
    // ..
    // other variables and functions
}

: 加载Xml文件

目的: 我不想更改每个文件的结构或标签以匹配    某些代码模式,例如此处建议Load in a simple list of objects

愿景

  • Xml中不存在的任何变量都应设置为null(默认情况下会发生?)这里我知道缺少参数targetTest,其中Sample构造函数需要,但如果我不知道缺少什么怎么办?另外我知道类ReferenceCount的{​​{1}}不在xml等中。

  • 与文件匹配但不编辑所有文件以匹配代码的代码

当我没有Verification时,我的代码使用XmlSerializer。现在该文件有一个List<Sample>,下面的代码使用List<Sample>,但会弹出错误:

  

对象引用未设置为对象的实例

XDocument

1 个答案:

答案 0 :(得分:1)

您的代码正在尝试使用DesiredTargets读取h.Element("name").Value的子元素。如果元素不存在,Element会返回null,对Value属性的调用将抛出NullReferenceException

您尝试阅读的7个元素中没有一个实际存在,因此所有这些都会导致您遇到的问题。它们不是元素,它们是Sample元素的属性。顺便说一句,在LINQ to XML中有内置的显式转换,这意味着您不必解析字符串:

所以,这样的事情实际上会起作用:

doc.Descendants("DesiredTargets")
    .Elements("Sample")
    .Select(x => new Sample(
        null,
        (double)x.Attribute("X1"),
        (double)x.Attribute("X2"),
        (double)x.Attribute("Y1"),
        (double)x.Attribute("Y2"),
        (double)x.Attribute("A"),
        (double)x.Attribute("B"),
        (double)x.Attribute("C"),
        (int)x.Attribute("ReferenceNumber"))
    ).ToList();

也就是说,使用XmlSerializer比使用手动编码序列化要好得多。 List<T>应该不是问题。