我有大量的Xml文件包含double
,int
,DateTime
,string
,lists 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
答案 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>
应该不是问题。