2015-01-06 2 views
0

Я пытаюсь Linq-to-XML, чтобы сократить мой код и сделать его более читаемым, но я столкнулся с ошибкой, когда я продолжаю получать нуль. Я пытаюсь сделать следующий код работу:Element extract return null

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

Но когда я пытаюсь использовать foos или открыть View Results в VS, я получаю ошибку пустую или «Объект не установлен для ссылки». Резервное копирование с Linq-на-XML, я написал следующий код, который работает прекрасно:

var listOfFoos = new List<FooItem>(); 
var xdoc = XDocument.Parse(fooData); 
var foos = xdoc.Descendants("Foo").ToList(); 
foreach (var f in foos) 
{ 
    var foo = new FooItem(); 
    foo.x = f.Element("X").Value; 
    foo.y = float.Parse(f.Element("Y").Value); 
    foo.z = int.Parse(f.Element("Z").Value); 
    listOfFoos.Add(s); 
} 

Так что же мешает XML Linq-на-от работы в то время как моя вторая реализация идет без сучка и задоринки?

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> 

Это FooItem класс:

public class FooItem 
{ 
    public string X { get; set; } 
    public float Y { get; set; } 
    public int Z { get; set; } 
} 

И трассировки стека я получаю ошибки:

"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 
+0

Как выглядит XML? –

+0

Добавил его, извините за то, что забыл положить его. –

+1

Рассмотрите возможность публикации минимального, но полного образца, позволяющего воспроизвести полученную вами ошибку. –

ответ

-1

ясно выглядит например, у вас неправильный 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)); 

здесь конструктор обеспечит для проверки здравомыслие и поставить 0 или -1, если ошибочные значения появляется в XML ,

Надеюсь, что помогает !!!

+0

Если XML неверен, то почему второй кодовый блок работает отлично? Он анализирует элементы XML без обработки ошибок, но я возвращаю данные. –

+0

Я выполнил нулевую проверку, и TryParse позаботится об обработке ошибок, обратитесь к tryparse здесь ... http://msdn.microsoft.com/en-us/library/system.single.tryparse%28v=vs.110%29.aspx, вы можете посмотреть результат и проверить, где Y, Z равно нулю, и именно там ваш код создает проблему раньше. –

+0

Я не думаю, что вы получаете мою мысль. Я не терпеть неудачу, потому что у меня ошибочные значения в XML. Это подтверждается вторым блоком кода. Если бы были ошибочные значения XML, которые могли бы вызывать ошибки при анализе, то оба блока кода потерпели бы неудачу. Однако второй кодовый блок работает отлично. –

0

В этом коде не найдено проблем, пожалуйста, проверьте, не требуется ли в этом изменение.

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