Avatar billede CodingJoe Nybegynder
06. marts 2011 - 13:24 Der er 15 kommentarer og
1 løsning

LINQ 2 XML Hvordan henter jeg xml strukturen fra en node.

Det er ved at drive mig til vanvid :(

jeg har fx. følgende xml
<Rod>
<Personer>
  <Person>
  <Navn>Navn1</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn2</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn3</Navn>
  <Alder>0</Alder>
  </Person>
</Personer>
</Rod>

Hvis jeg nu vil have alle Personer. Dvs noget lignende inner xml...hvordan gør jeg det?

Jeg vil have følgende xml:
  <Person>
  <Navn>Navn1</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn2</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn3</Navn>
  <Alder>0</Alder>
  </Person>
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 13:28 #1
Hvis muligt så en collection af 'Person', men med
  '<Person>
    <Navn>Navn1</Navn>
    <Alder>0</Alder>
  </Person>' som tekst streng i hver Person[i]
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 13:30 #2
Har prøvet noget lignende...
var personCollection = xDoc.Descendants("Rod").Select(s => new {Person = p.Element("Personer").Elements().ToList()});
Avatar billede Syska Mester
06. marts 2011 - 14:59 #3
Giver overstående fejl ? eller ? Hvad er resultatet ?

mvh
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:07 #4
Den ser ud til at give mig en collection af Person.

...men når jeg forsøger et iterere igennem således:
string personXml = string.Empty;
foreach(var p in personCollection){
  personXml += p.Person[0].ToString();
}

Får jeg den første ud...men jeg vil jo gerne bare skrive p.Person.ToString();
Avatar billede Syska Mester
06. marts 2011 - 15:14 #5
Den vil jo give dig en liste i din liste pga:
var personCollection = xDoc.Descendants("Rod").Select(s => new {Person = p.Element("Personer").Elements().ToList()});

Select returnere en liste ...

p.Element("Personer").Elements().ToList() returnere en liste

Dvs du har en liste som indeholder et anonym type af overstående liste.

Jeg er dog ikke helt sikker på hvad du vil ...

Følgende tager Name og Age ud ...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace ReadingAnXmlDocument
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument document = XDocument.Parse(@"<Rod>
<Personer>
  <Person>
  <Navn>Navn1</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn2</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn3</Navn>
  <Alder>0</Alder>
  </Person>
</Personer>
</Rod>");

            var xElement = document.Element("Rod").Element("Personer").Elements("Person");
           
            foreach (var element in xElement)
            {
                Console.WriteLine("Name: {0}, Age. {1}", element.Element("Navn").Value, element.Element("Alder").Value);
            }
        }
    }
}

Men vil du have en liste af Personer ala klassen

class Person // med 2 properties, Name og Age
{
public string Name {get; set;}
public int Age {get; set;}
}
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:23 #6
Ja, det er med vilje, jeg gør brug af en anonym type...jeg vil sådan set bare have tekst strengen af xml...ikke mappe det over i en entitets klasse. Eksemplet giver ikke mening...men konceptet skal afprøves.

En collection af strenge, der holder på Personer (List<string> personer = new List<string>())

personer.Add("<Person><Navn>Navn3</Navn><Alder>0</Alder></Person>");
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:26 #7
Ups....jeg mener denne:

.Select(p=> new {Person = p.Element("Personer").Elements().ToString()}).ToList(); //Måske?
Avatar billede Syska Mester
06. marts 2011 - 15:32 #8
Dvs noget ala:

using System;
using System.Linq;
using System.Xml.Linq;

namespace ReadingAnXmlDocument
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument document = XDocument.Parse(@"<Rod>
<Personer>
  <Person>
  <Navn>Navn1</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn2</Navn>
  <Alder>0</Alder>
  </Person>
  <Person>
  <Navn>Navn3</Navn>
  <Alder>0</Alder>
  </Person>
</Personer>
</Rod>");

            var xElement =
                document.Element("Rod").Element("Personer").Elements("Person").Select(x => x.ToString()).ToList();

            foreach (var element in xElement)
            {
                Console.WriteLine();
                Console.WriteLine(element);
            }
        }
    }
}
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:33 #9
Nope...ingen success.

Så en collection af strenge ved navn personCollection, der indeholder,... "<Person><Navn>Navn3</Navn><Alder>0</Alder></Person>" pr person...
Avatar billede Syska Mester
06. marts 2011 - 15:36 #10
Ja, ligesom jeg lige har postet ...

Har du prøvet at køre det ?
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:36 #11
ahh prøver lige din version...
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:40 #12
Det ser ud til at virker...men jeg bruger en xDoc.Descendants(Rod)...kan se du ikke bruger den...
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:45 #13
Smid du bare points :)
Avatar billede Syska Mester
06. marts 2011 - 15:45 #14
Som jeg læser den ... tager den alle Noder under "xDoc" som er af XName eller alle.

Dvs du kan også bruge:
IEnumerable<XElement> xElements = document.Descendants("Person");
foreach (var element in xElements)
{
    Console.WriteLine(element.ToString());
}

Men hvis en Person kan have en Person ... så vil det give problemer.
Avatar billede Syska Mester
06. marts 2011 - 15:45 #15
svar
Avatar billede CodingJoe Nybegynder
06. marts 2011 - 15:48 #16
Ved ikke hvornår xDoc.Descendants("Rod") er smart at bruge...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester