none
Linq to XML Fehler beim lesen RRS feed

  • Frage

  • Hallo,

    ich habe ein seltsames Verhalten beim Lesen einer XML Datei.

    string divis = (from c in xdoc.Descendants(Division)
                                 select c.Element(Division).Value).FirstOrDefault();

    Damit lese ich das Element <Division> aus folgender Datei:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <LaboratoryOrder>
      <ID>0e375200-fd53-4168-9be6-f33f253449ca</ID>
      <Client>Client name</Client>
      <Department>ZEB</Department>
      <Costcenter>5</Costcenter>
      <IsSapCostcenter>true</IsSapCostcenter>
      <ItemsArchive>Zurück zum Auftraggeber</ItemsArchive>
      <Projectnumber></Projectnumber>
      <KindOfTest>Standard Labortest (FTR)</KindOfTest>
      <Division>Knife</Division>
      <Milestone></Milestone>
      <AdditionalInfo>sdfsdf</AdditionalInfo>
      <Items>
        <Item>
          <Articlenumber>873000</Articlenumber>
          <Brand>Excellent Keramik</Brand>
          <KindOfItem>Pedro</KindOfItem>
          <Manufacturer>sdfdf</Manufacturer>
          <Note>sdfsdf</Note>
          <FTR-Tests>
            <Testmethod Testmethod="Visual Inspection" Quantity="5"></Testmethod>
            <Testmethod Testmethod="Dimension Check" Quantity="5"></Testmethod>
            <Testmethod Testmethod="Weight of product" Quantity="5"></Testmethod>
            <Testmethod Testmethod="Cutting edge thickness (DIN EN 8442-1)" Quantity="5"></Testmethod>
          </FTR-Tests>
        </Item>
        <Item>
          <Articlenumber>14501-001</Articlenumber>
          <Brand>HI Manicure Body &amp; Care</Brand>
          <KindOfItem>schräg</KindOfItem>
          <Manufacturer></Manufacturer>
          <Note>sdfsdf</Note>
          <FTR-Tests>
            <Testmethod Testmethod="Visual Inspection" Quantity="1"></Testmethod>
            <Testmethod Testmethod="Dimension Check" Quantity="1"></Testmethod>
            <Testmethod Testmethod="Dishwasher resistance (DIN EN  12875-1: 30 cylces)" Quantity="1"></Testmethod>
            <Testmethod Testmethod="Cutting edge thickness (DIN EN 8442-1)" Quantity="1"></Testmethod>
          </FTR-Tests>
        </Item>
      </Items>
    </LaboratoryOrder>


    Beim lesen erhalte ich folgende Fehlermeldung:

    Error Message:
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    --------------------------------------------------------------------------------

    Error Source:
    LaboratoryOrder
    --------------------------------------------------------------------------------

    StackTrace:
       bei LaboratoryOrder.Model.XML_FileManager.<ReadLaboratoryOrderXMLFile>b__2(XElement c) in c:\CSharp_Projects\LaboratoryOrder.4\LaboratoryOrder\Model\XML_FileManager.cs:Zeile 238.
       bei System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       bei System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
       bei LaboratoryOrder.Model.XML_FileManager.ReadLaboratoryOrderXMLFile(String path) in c:\CSharp_Projects\LaboratoryOrder.4\LaboratoryOrder\Model\XML_FileManager.cs:Zeile 237.
    --------------------------------------------------------------------------------

    Kurz vorher im Code lese ich auf gleiche Weise ein anderes Element:

    string milestone = (from m in xdoc.Descendants(LaboratoryOrder)
                                        select m.Element(Milestone).Value).FirstOrDefault();

    Das klapp anstandslos.

    Was könnte hier falsch sein?


    Gruß

    Peter

    Wer grob fahrlässige Rechtschreibfehler findet, darf diese behalten ;0)

    Donnerstag, 9. April 2015 13:39

Antworten

Alle Antworten

  • Hallo,

    du arbeitest hier mit Variablen, anstatt direkt die Strings zu übergeben. Ich gehe mal davon aus, das Division den Wert "Division" hat und für die anderen Variablen ebenfalls der entsprechende Tag-Name.

    In deinem Funktionierenden Beispiel hast du nur einen LaboratoryOrder-Knoten - den Root-Knoten. Dieser enthält einen Unter-Tag Milestone.

    In dem nicht funktionierenden Beispiel rufst du die Tags (hier nur einer) Division ab. Da dieser keine Unterknoten mehr besitzt, kannst du mittels Element keine weiteren Divison-Unter-Knoten abrufen. Daher ist der zurück gegebene Wert null, und es wird die o.g. Exception beim abrufen von Value geworfen.

    Du musst also die Abfrage entsprechend anpassen:

    var div = xdoc.Root.Element(Division).Value;


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Peter Sypek Donnerstag, 9. April 2015 19:43
    Donnerstag, 9. April 2015 13:49
    Moderator
  • Verflixt 😄 Ich seh vor lauter Buchstaben den Wald nicht mehr. War wohl zu lang am Rechner 😝

    Gruß

    Peter

    Wer grob fahrlässige Rechtschreibfehler findet, darf diese behalten ;0)

    Donnerstag, 9. April 2015 19:43