Avatar billede Greenland Nybegynder
08. februar 2010 - 17:13 Der er 5 kommentarer og
1 løsning

Linq xml xdoc

Hej,

Jeg har et akut problem.
Jeg skal indlæse en xml fil og har anvendt linq til formålet, hvilket virker meget smart.

Men hvis xml filen mangler et felt, som jeg forsøger at select´e så fejler hele processen.

XDocument xdoc = XDocument.Load(@filepath);
            try
            {
                var res = from userNumber in xdoc.Descendants("basicModule")
                          select "<USERNUMBER> " + userNumber.Element("userNumber").Value + "</USERNUMBER>" +
                              "  <GROUPNUMBER> " + userNumber.Element("groupNumber").Value + "</GROUPNUMBER>" +


så kører jeg resultatet igennem med en foreach i res.


Mit problem er at hvis <GROUPNUMBER> ikke altid findes i xml´en så får jeg en fejl, og kan ikke køre videre.

Er der nogen måde at error handle, hvis ovenstående select fejler ??

mit xml doc ser således ud:
<basicModule>
            <userNumber>12345</userNumber>
            <groupNumber>21</groupNumber>
           
        </basicModule>
   

mvh

Greenland
Avatar billede janus_007 Nybegynder
08. februar 2010 - 18:06 #1
Den kan løses på forskellige måder, den første og den nemmeste, en Func

Altså:
Func<XElement, string> CheckForValue = x => x != null ? x.Value : null;


            var res = from userNumber in xdoc.Elements()
                          select new
            {
                User = userNumber.Element("userNumber"),
                Group = CheckForValue(userNumber.Element("groupNumber"))
            };


Eller den som jeg bedre kan li :), hvor du smidee en extension på XElement sådan at du automatisk for genereret default elementet hvis dette mangler:

Func<XElement, string> CheckForValue = x => x != null ? x.Value : null;


            var res = from userNumber in xdoc.Elements()
                          select new
            {
                User = userNumber.Element("userNumber"),
                Group = CheckForValue(userNumber.Element("groupNumber")),
                GroupAlternative = userNumber.Element("groupNumber").ValueOrDefault("GroupAlternative")
            };

og extensionen:
public static class Extensions
    {
        public static XElement ValueOrDefault(this XElement element, XName name)
        {
            if (element != null)
                return new XElement(name, element.Value);
            else
                return new XElement(name);
        }
    }
Avatar billede Greenland Nybegynder
08. februar 2010 - 21:52 #2
Simpelthen genialt !!!:-)

... og så kan man også tilgå "new" variablerne der oprettes direkte.... nydeligt

Tak, smid et svar

mvh

Greenland
Avatar billede janus_007 Nybegynder
08. februar 2010 - 23:04 #3
Takker :)
Jeg nyder at arbejde i Linq så det var en sand fornøjelse.
Avatar billede Greenland Nybegynder
09. februar 2010 - 17:28 #4
Hej igen,

Jeg har behov for at få en where condition ind i min linq kode:


XDocument xdoc = XDocument.Load(@filepath);
            try
            {
                var res = from userNumber in xdoc.Descendants("basicModule")
                  where userNumber.Element("userNumber").ToString() == "1234"
                          select new
                          {
                              USERNUMBER = userNumber.Element("userNumber").Value,
                              GROUPNUMBER = CheckForValue(userNumber.Element("groupNumber")),
            };


Det kompilerer ok, men der returneres ingen data, selv om der i xml dokumentet er et userNumber med 1234 i ?

Noget forslag....:-

Greenland
Avatar billede janus_007 Nybegynder
09. februar 2010 - 19:36 #5
Hej Greenland

Når du tager ToString på et Element får du xml'en, eks.vis :
"<userNumber>1234</userNumber>"

Du skal referere til Value, altså:
userNumber.Element("userNumber").Value == "1234"
Avatar billede Greenland Nybegynder
09. februar 2010 - 23:02 #6
ok, tak det virker
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