Benutzer mit den meisten Antworten
Linq to XML Fehler beim lesen

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 & 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)
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
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