20. februar 2011 - 17:07Der er
43 kommentarer og 1 løsning
Hente væerdier vha, LINQ2XML
Jeg har følgende xml struktur (kunne være i bedre kvalitet, men har desværre kun dette at arbejde med): Normalt kan jeg klare mig med '//NAVN' i almindelig XPATH (med klarhed over man skal passe på performance med '//' notationen). Dog prøver jeg at skrive noget LINQ til xml, der kan give mig alle navnene i Tabel1 strukturen. Et Linq udtryk, der kan give mig alle navnene ville også være dejligt at få. <ROOT> <FOO> <TABEL1> <TABELELEMENT> <NAVN>MitNavn1</NAVN> <VAERDI>2,530</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn2</NAVN> <VAERDI>2,5430</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn3</NAVN> <VAERDI>2,540</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn4</NAVN> <VAERDI>2,550</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn5</NAVN> <VAERDI>2,504</VAERDI> </TABELELEMENT> </TABEL1> <TABEL2> <TABELELEMENT> <NAVN>MitNavn6</NAVN> <VAERDI>2,450</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn7</NAVN> <VAERDI>2,550</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn8</NAVN> <VAERDI>2,5503</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn9</NAVN> <VAERDI>2,505</VAERDI> </TABELELEMENT> <TABELELEMENT> <NAVN>MitNavn10</NAVN> <VAERDI>2,540</VAERDI> </TABELELEMENT> </TABEL2> </FOO> </ROOT>
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
var res = from v in _xDoc.Elements("ROOT") select v.Elements("FOO").Elements("TABEL1").Elements("TABELELEMENT").Elements("NAVN");
Denne gav mig kun det første navn...hvor jeg gerne ville have alle navnene... den sidste betingelse i mit udtryk kan vel skrive om, så det bliver alle navnene eller noderne inden for TABEL1 jeg får ud...
Faktisk giver denne mig alle navnene: var res = from v in _xDoc.Elements("ROOT") select v.Elements("FOO").Elements("TABEL1").Elements("TABELELEMENT").Elements("NAVN");
Men jeg får "<NAVN>MineNavne</NAVN>" med ud...nu skal jeg sådan set bare have tekst værdien ud :S
Dvs: var res = from v in _xDoc.Elements("ROOT") select v.Elements("FOO").Elements("TABEL1").Elements("TABELELEMENT").Elements("NAVN").Select(a => a.Value);
var res = from v in _xDoc.Elements("ROOT") select v.Elements("FOO").Elements("TABEL1").Elements("TABELELEMENT").Elements("NAVN").Select(a => a.Value).ToArray(); var n = res.ElementAt(0).ToArray();
var res = from v in _xDoc.Elements("ROOT") select v.Elements("FOO").Elements("TABEL1").Elements("TABELELEMENT").Elements("NAVN").Select(a => a.Value); var n = res.ToArray();
Jeg kan se at "TABEL1" og "TABEL2" kan forvolde mig problemer...der er ikke mulighed for at springe det element over? Jeg er sådan set bare interesseret i værdierne i mellem, og vil helst være fri for at smide en parameter med over, der hedder 'TABEL1' eller 'TABEL2'.
Kan det lade sig gøre...siger jeg, mens jeg accepterer svaret...og håber på et svar fra de kloge(dvs. Arne). :)
ahhh ok...det kan jeg lige prøve så...du har alligevel forstået mit spørgsmål :) Det er bare mig der ikke har briller på...jeg så ikke den tomme element() Skrev selv koden i mit eksempel...og det blev med TABEL1.
var res = _xDoc.Root.Element("FOO").Elements().Elements("TABELELEMENT"); var res2 = res.Select(element => new { Navn = element.Element("NAVN").Value, Vaerdi = element.Element("VAERDI").Value}).ToArray();
I det øjeblik jeg sætter "TABEL1" i det tomme Elements(), så får jeg svar tilbage..men får et null reference exception nu.
Så jeg skal bare have "NAVN" og "VAERDI" ud, som befinder sig i TABEL1, men jeg kan faktisk ikke være sikker...det kan komme ud i TABEL2 i visse tilfælde...derfor vil jeg stadigvæk have alle "NAVN" og "VAERDI" ud uanset hvilken TABEL, den befinder sig i.
PS! NAVN_A og VAERDI_A er jeg fx. ikke interesseret i. Kun dem uden underscore.
Ja, meget ked af det tog længere tid...jeg vidste ikke at xml strukturen ville give anledning til nogle problemer... Jeg er sikker på dit eksempel virker...men skal nok kigge videre på det imorgen :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.