none
XML per LINQ anfragen RRS feed

  • Frage

  • Hallo Forum,

    ich versuche folgende XML Struktur per LINQ anzufragen, bekomme aber immer Null raus.

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <TranslateModuls>
      <Class ClassName="Invention" CultureCode="de-DE">
        <Element Key="lblDescription" Value="Bezeichnung" Value1="" ButtonOk="" ButtonCancel="" ButtonNo="" />
        <Element Key="lblInventionId" Value="Erfindung" Value1="" ButtonOk="" ButtonCancel="" ButtonNo="" />
    <Element Key="lblDate" Value="Datum" Value1="" ButtonOk="" ButtonCancel="" ButtonNo="" /> </Class> <Class ClassName="Inventor" CultureCode="de-DE"> <Element Key="lblName" Value="Name" Value1="" ButtonOk="" ButtonCancel="" ButtonNo="" /> <Element Key="lblInventorId" Value="Id" Value1="" ButtonOk="" ButtonCancel="" ButtonNo="" /> </Class> </TranslateModuls>

    Ich wollte "ClassName" und "CultureCode" im where-Ausdruck und dann die darunterliegenden Elemente bekommen um diese danach in eine Liste stecken zu können. Es können natürlich beliebig viele Elemente vorhanden sein.

    Mit dieser Lösung bekomme ich aber immer Null raus.

    XDocument localizationXml = XDocument.Load(localizationFile);
    var result = (from l in localizationXml.Descendants()
       where (string)l.Attribute("ClassName") == "Test" &&
       (string)l.Attribute("CultureCode") == "de-DE"
       select new { Key = l.Attribute("Key"), Value = l.Attribute("Value") });
    

    Hat jemand eine Idee wie es tatsächlich aussehen muß ?

    Danke und Gruß
    Gerhard

    Montag, 5. September 2016 18:31

Antworten

  • Hi Gerhard,
    nachfolgend eine kleine Konsolen-Demo, wie man Dein Problem lösen kann:

    using System;
    using System.Linq;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
      class Program26
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute(@"Program26XML.xml");
          }
          catch (Exception ex)
          {
            var ex1 = ex; string msg = "";
            while (ex1 != null) { msg += ex1.Message + Environment.NewLine; ex1 = ex1.InnerException; }
            Console.WriteLine(msg);
          }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        internal class Demo
        {
          internal void Execute(string localizationFile)
          {
            XDocument localizationXml = XDocument.Load(localizationFile);
            var result = from l2 in (from l1 in localizationXml.Descendants("Class")
                                     where (string)l1.Attribute("ClassName") == "Invention" &&
                                     (string)l1.Attribute("CultureCode") == "de-DE"
                                     select l1).Descendants()
                         select new { Key = l2.Attribute("Key"), Value = l2.Attribute("Value") };
            foreach (var item in result)
            {
              Console.WriteLine($"{item.Key}: {item.Value}");
            }
          }
        }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Gerhard Ahrens Dienstag, 6. September 2016 06:30
    Dienstag, 6. September 2016 05:30

Alle Antworten

  • Hallo Gerhard,
    wenn Du statt:
    where (string)l.Attribute("ClassName") == "Test" &&

    das hier schreibst soll etwas herauskommen.
    where (string)l.Attribute("ClassName") == "Invention" &&
    HTHGrüße Alexander

    Dienstag, 6. September 2016 05:17
  • Hallo Alexander,

    nein, leider nicht, ich hatte "Test" es später hier Forum gegen "Invention" ausgetauscht.

    Das ist leider nicht die Ursache. Ich hatte da auch schon probiert, deswegen auch die Abweichung im Beispiel.

    Danke und Gruß
    Gerhard

    Dienstag, 6. September 2016 05:28
  • Hi Gerhard,
    nachfolgend eine kleine Konsolen-Demo, wie man Dein Problem lösen kann:

    using System;
    using System.Linq;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
      class Program26
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute(@"Program26XML.xml");
          }
          catch (Exception ex)
          {
            var ex1 = ex; string msg = "";
            while (ex1 != null) { msg += ex1.Message + Environment.NewLine; ex1 = ex1.InnerException; }
            Console.WriteLine(msg);
          }
          Console.Write("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        internal class Demo
        {
          internal void Execute(string localizationFile)
          {
            XDocument localizationXml = XDocument.Load(localizationFile);
            var result = from l2 in (from l1 in localizationXml.Descendants("Class")
                                     where (string)l1.Attribute("ClassName") == "Invention" &&
                                     (string)l1.Attribute("CultureCode") == "de-DE"
                                     select l1).Descendants()
                         select new { Key = l2.Attribute("Key"), Value = l2.Attribute("Value") };
            foreach (var item in result)
            {
              Console.WriteLine($"{item.Key}: {item.Value}");
            }
          }
        }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Warum Groß- und Kleinschreibung wichtig ist:
    Der Gefangene floh.
    Der gefangene Floh.

    • Als Antwort markiert Gerhard Ahrens Dienstag, 6. September 2016 06:30
    Dienstag, 6. September 2016 05:30
  • Hallo Peter,

    was soll ich sagen, kaum man man es richtig, funktioniert es auch.

    Danke und Gruß
    Gerhard

    Dienstag, 6. September 2016 06:31