C# 返回null的元素提取
为了缩短代码并使其更具可读性,我尝试使用LINQtoXML,但我遇到了一个错误,不断得到一个空值。我正在努力使以下代码正常工作:C# 返回null的元素提取,c#,linq-to-xml,C#,Linq To Xml,为了缩短代码并使其更具可读性,我尝试使用LINQtoXML,但我遇到了一个错误,不断得到一个空值。我正在努力使以下代码正常工作: var listOfFoos = new List<FooItem>(); var xdoc = XDocument.Parse(fooData); var fooNodes = xdoc.Descendants("Foo"); var foos = fooNodes.Select(f => new FooItem() {
var listOfFoos = new List<FooItem>();
var xdoc = XDocument.Parse(fooData);
var fooNodes = xdoc.Descendants("Foo");
var foos = fooNodes.Select(f => new FooItem()
{
x = f.Element("X").Value,
y = float.Parse(f.Element("Y").Value),
z = int.Parse(f.Element("Z").Value)
});
foreach(var foo in foos)
{
listOfFoos.Add(foo);
}
那么,当我的第二个实现顺利完成时,是什么阻止了Linq到XML的工作呢
XML如下所示:
<Foos>
<Foo>
<X>AFE3-JJ-WO2N-353E</X>
<Y>3341.3426661</Y>
<Z>10</Z>
</Foo>
<Foo>
<X>30IE-N2-IIS2-WER4</X>
<Y>154.558921</Y>
<Z>5</Z>
</Foo>
...
</Foos>
以及我从错误中得到的堆栈跟踪:
"Object reference not set to an instance of the object."
at SigCaptureWeb.Controllers.HomeController.<RetrievePDF>b__1(XElement f) in c:\Users\ams\Documents\Visual Studio 2013\Projects\SigCapture\SigCaptureWeb\Controllers\HomeController.cs:line 101
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at SigCaptureWeb.Controllers.HomeController.RetrievePDF(String formCode, String dataXML) in c:\Users\ams\Documents\Visual Studio 2013\Projects\SigCapture\SigCaptureWeb\Controllers\HomeController.cs:line 108
“对象引用未设置为对象的实例。”
在c:\Users\ams\Documents\Visual Studio 2013\Projects\SigCapture\SigCaptureWeb\Controllers.HomeController.1(XElement f)中的SigCaptureWeb.Controllers.HomeController.b\uu 1中:第101行
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在c:\Users\ams\Documents\Visual Studio 2013\Projects\SigCapture\SigCaptureWeb\Controllers.HomeController.RetrievePDF(字符串格式代码,字符串数据XML)中
很明显,您的xml错误,可能在标记中没有值,或者键入的值错误,您可以如何处理/检查错误是什么
internal class FooItem
{
public FooItem(XElement xElement)
{
float yvar = -1;
int zvar = -1;
if (xElement.Element("X") == null) X = "";
else X = xElement.Element("X").Value;
if (xElement.Element("Y") == null) Y = yvar;
else
{
if (float.TryParse(xElement.Element("Y").Value, out yvar))
Y = yvar;
}
if (xElement.Element("Z") == null) Z = zvar;
else
{
if (int.TryParse(xElement.Element("Z").Value, out zvar))
Z = zvar;
}
}
public string X { get; set; }
public float Y { get; set; }
public int Z { get; set; }
}
然后像这样在投影中调用构造函数
var foos = fooNodes.Select(f => new FooItem(f));
在这里,构造函数将确保进行健全性检查,并在XML中出现错误值时放入0或-1
希望有帮助 我没有发现此代码中存在任何问题,请验证此代码是否需要更改
string fooData = @"<Foos>
<Foo>
<X>AFE3-JJ-WO2N-353E</X>
<Y>3341.3426661</Y>
<Z>10</Z>
</Foo>
<Foo>
<X>30IE-N2-IIS2-WER4</X>
<Y>154.558921</Y>
<Z>5</Z>
</Foo>
</Foos>";
var listOfFoos = new List<FooItem>();
var xdoc = XDocument.Parse(fooData);
var fooNodes = xdoc.Descendants("Foo");
var foos = fooNodes.Select(f => new FooItem()
{
X = f.Element("X").Value,
Y = float.Parse(f.Element("Y").Value),
Z = int.Parse(f.Element("Z").Value)
});
foreach (var foo in foos)
{
listOfFoos.Add(foo);
}
string fooData=@”
AFE3-JJ-WO2N-353E
3341.3426661
10
30IE-N2-IIS2-WER4
154.558921
5.
";
var listofoos=新列表();
var xdoc=XDocument.Parse(fooData);
var foododes=xdoc.substands(“Foo”);
var foos=foododes.Select(f=>newfooitem()
{
X=f元素(“X”)值,
Y=float.Parse(f.Element(“Y”).Value),
Z=int.Parse(f.Element(“Z”).Value)
});
foreach(foos中的var foo)
{
添加(foo);
}
XML是什么样子的?添加它,抱歉忘记把它放进去。考虑发布一个最小但完整的示例,让我们重现你所得到的错误。我认为没有实际的代码我们是无法帮助的。您的xml不包含您正在解析的浮点和整数,并且您的示例使用了您没有显示的变量(即listofoos.Add)
更改xml以添加一些有效值,这段代码对我来说很好。如果xml是错误的,那么为什么第二个代码块工作得很好?它解析xml元素而不处理错误,但我正在返回数据。我执行了空检查&TryParse将负责错误处理,请参阅此处的TryParse…,您可以查看然后检查其中的Y,Z为零,这是代码早期产生问题的地方。我不认为你明白我的意思。我没有失败,因为我的XML中有错误的值。第二个代码块证明了这一点。如果有错误的XML值会在解析时出错,那么两个代码块都会失败。但是,第二个代码块代码块工作得非常好。哦,好的,在第二个代码块中,您编写了listofoos.Add(s);最后,s实际上不存在,这是一种类型吗?
var foos = fooNodes.Select(f => new FooItem(f));
string fooData = @"<Foos>
<Foo>
<X>AFE3-JJ-WO2N-353E</X>
<Y>3341.3426661</Y>
<Z>10</Z>
</Foo>
<Foo>
<X>30IE-N2-IIS2-WER4</X>
<Y>154.558921</Y>
<Z>5</Z>
</Foo>
</Foos>";
var listOfFoos = new List<FooItem>();
var xdoc = XDocument.Parse(fooData);
var fooNodes = xdoc.Descendants("Foo");
var foos = fooNodes.Select(f => new FooItem()
{
X = f.Element("X").Value,
Y = float.Parse(f.Element("Y").Value),
Z = int.Parse(f.Element("Z").Value)
});
foreach (var foo in foos)
{
listOfFoos.Add(foo);
}