16. november 2012 - 15:46Der er
11 kommentarer og 1 løsning
linq - select af flere columns
Hej,
Jeg har selectet et column/element i xml vha linq i c#:
lst.Items.Clear(); var q = from c in XDocument.Load(@"C:\temp\product.xml").Descendants("Product") from view in c.Element("member").Elements("ProductView") //where (int)view.Element("ViewId") == 44
from fieldId in view.Elements("myfield") //from assetText in view.Elements("AssetText") select fieldId.Element("Text");
foreach (XElement item in q) { lst.Items.Add(item.Value); }
det giver mig to tekster for id 44 og en for 45 so far so good. Men hvordan får jeg AssetText med også?
Jeg ønsker at selecte mere end et felt under ProductView, og jeg tænkte noget med: .. from fieldId in view.Elements("myfield") from assetText in view.Elements("AssetText") og så noget med: select assetText.Element("Text"),select fieldId.Element("Text"); ... men det virker desværre ikke:-(
xml´en ser således ud:
<Product> <member> <ProductView> <ViewId>44</ViewId> <AssetText> <Text>my first Asset Text</Text> </AssetText> <myfield> <Text>first myfield belongs to id 44</Text> </myfield> <AssetText> <Text>my second Asset Text</Text> </AssetText> <myfield> <Text>next myfield belongs to id 44</Text> </myfield> </ProductView> <ProductView> <ViewId>45</ViewId> <AssetText> <Text>my third Asset Text</Text> </AssetText> <myfield> <Text>first myfield belongs to id 45</Text> </myfield> </ProductView> </member> </Product>
class X { string at = ""; public string AT { set {at = value; } get {return at; } }
string fi = ""; public string FI { set { fi = value; } get { return fi; } }
} var q = from c in XDocument.Load(@"C:\temp\product.xml").Descendants("Product") from view in c.Element("member").Elements("ProductView") //where (int)view.Element("ViewId") == 44 from fieldId in view.Elements("myfield") from assetText in view.Elements("AssetText") select new X { AT = assetText.Element("Text").ToString(), FI = fieldId.Element("Text").ToString() };
class X { string at = ""; public string AT { set {at = value; } get {return at; } }
string fi = ""; public string FI { set { fi = value; } get { return fi; } }
} var q = from c in XDocument.Load(@"C:\temp\product.xml").Descendants("Product") from view in c.Element("member").Elements("ProductView") //where (int)view.Element("ViewId") == 44 from fieldId in view.Elements("myfield") from assetText in view.Elements("AssetText") select new X { AT = assetText.Element("Text").ToString(), FI = fieldId.Element("Text").ToString() };
Hej Arne, tak for eksempler, Ja xml´en kunne godt trænge til at se anderledes ud, men den kommer fra et andet system som jeg ikke kan ændre:-(
Må jeg spørge hvor Zip i ats.Zip(mfs, (at,mf) er defineret? Hvad skulle der stå isteden for ?
Dit første eksempel fra 16. november 2012 kl. 16:08:29 (det med select new X) virkede umiddelbart perfekt, indtil jeg lagde mærke til at resultatet/outputtet ikke var korrekt:
my first Asset Text first myfield belongs to id 44 my second Asset Text first myfield belongs to id 44 my first Asset Text next myfield belongs to id 44 my second Asset Text next myfield belongs to id 44 my third Asset Text first myfield belongs to id 45
i dit nye eksempel hvor xml´en er justeret er det korrekt: my first Asset Text : first myfield belongs to id 44 my second Asset Text : next myfield belongs to id 44 my third Asset Text : first myfield belongs to id 45
.. jeg forsøger om jeg kan få det samme til at virke med den "gamle" xml struktur
Hej Arne, ok tak, jeg kørte framework 3.5. zip er en del af f 4.0
Smider du et svar...
Lige på falderebet, så har jeg svært ved at finde ud af hvor man skal starte en aflæsning i et xml document. I mit hoved burde man i linq blot kunne fyre en sql sætning af på givne columns, hvorefter den selv fandt ud af at returnere værdierne, men det er måske for meget forlangt:-)
Hvordan ved jeg i følgende xml hvor jeg skal starte for at få fat på alle conformation (id,accountnumber,type)?Det forekommer mig svært at finde ud af:-( ellers tak for hjælpen...
Du kan vel bruge Descendants, men jeg vil klart anbefale at arbejde dig ned gennem strukturen, fordi saa ved du hvad du faar.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.