Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 返回null的元素提取_C#_Linq To Xml - Fatal编程技术网

C# 返回null的元素提取

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() {

为了缩短代码并使其更具可读性,我尝试使用LINQtoXML,但我遇到了一个错误,不断得到一个空值。我正在努力使以下代码正常工作:

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);
        }