none
Xml auslesen Frage? RRS feed

  • Frage

  • Hi ich habe eine Xml Datei die ich gerne auslesen würde allerdings weiß ich nicht wie ich an die eigentlichen daten komme.

    <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/_layout/guild/roster.xsl"?><page globalSearch="1" lang="de_de" requestUrl="/guild-info.xml">
      <tabInfo subTab="guildRoster" tab="guild" tabGroup="character" tabUrl="r=awdawp;gn=awdawds;cn=asdasa"/>
      <guildInfo>
        <guildHeader battleGroup="huhuh1232" count="100" faction="0" name="dawdwd" nameUrl="wadadd" realm="waddadsa" realmUrl="wadaddsa" url="r=awdawd;gn=adsdasdm">
          <emblem emblemBackground="45" emblemBorderColor="16" emblemBorderStyle="3" emblemIconColor="16" emblemIconStyle="163"/>
        </guildHeader>
        <guild>
          <members memberCount="100">
            <character achPoints="3230" classId="7" genderId="1" level="80" name="xxxxxx" raceId="11" rank="1" url="asdasd&amp;n=xxxxxx"/>
            <character achPoints="3510" classId="6" genderId="0" level="80" name="xxxxxe" raceId="3" rank="3" url="r=Derasdasd;n=xxxxxxe"/>
            <character achPoints="2335" classId="6" genderId="1" level="80" name="xxxxxy" raceId="1" rank="0" url="r=Dasd+Msdasd;n=sssssss"/>
            <character achPoints="210" classId="9" genderId="0" level="23" name="ccccdd" raceId="7" rank="6" url="r=sdadsasad;n=ddsddsar"/>
      </members> </guild> </guildInfo> </page>
    bisher ist es mir nur gelungen die "page" auszulesen diese zeigt mir dann die rubriken tabInfo, GuildHeader, guild.

    Wenn ich nun zum eintrag guild navigiere und anzeigen lasse bekomme ich nur eine liste in der nur "character" steht. Die nachfolgenden Information fehlen einfach.
    Für meine geplante Anwendung brauche ich aber die "achPoints", classId, usw als variable.

    Ich habe es bisher nicht einmal geschaft sie darzustellen hoffe hierbei kann mir jemand helfen.

    mfg Travian
    Freitag, 6. November 2009 20:57

Antworten

  • Hallo Travian,

    leider sagst Du uns nicht, mit welchen Methoden Du bisher versucht hast, das XML File zu lesen oder gar anzuzeigen.

    Hier mal ein Beispiel, das LINQ To XML nutzt, um die Attribute der "character" Elemente zu lesen und in einer Konsolenanwendung auszugeben:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          XDocument xml = XDocument.Load(@"file://D:\Temp\testfile.xml");
    
          var characters = from c in xml.Descendants("character") select c;
    
          foreach (XElement character in characters)
          {
            Console.WriteLine("=== {0} ===", character.Name);
    
            foreach (XAttribute att in character.Attributes())
            {
              Console.WriteLine("{0} => {1}", att.Name, att.Value);
            }
          }
    
          Console.Read();
        }
      }
    }

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Samstag, 7. November 2009 13:32
  • Hallo Travian,

    das Beispiel sucht sich alle "character" Elemente aus dem vorliegenden XML heraus. Danach durchläuft es die einzelnen Attribute dieser Elemente und gibt sie mit Namen und Wert auf der Konsole aus. Arrays sind da nicht im Spiel.

    Wenn Du jetzt nur einen einzelnes Attribut lesen und einer Variable zuordnen möchtest, machst Du das über die Attribute() Methode des XElement:

    string name = character.Attribute("name").Value;


    Wenn Du nur Elemente suchst, die bestimmte Attribute aufweisen, kannst Du das direkt über die LINQ Abfrage einschränken. In folgendem Beispiel werden nur noch "character" Elemente zurückgegeben mit der "raceId" 11:

    var characters = from c in xml.Descendants("character")
                           where
                             c.Attribute("raceId").Value == "11"
                           select c;

    Eine Referenz zum Einlesen bietet die MSDN:

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Samstag, 7. November 2009 16:35
  • Wenn Du einen bestimmten Wert in einem Label darstellen möchtest, kannst Du den über die Attribute-Methode abfragen und dem Label.Text zuweisen, so wie schon bei der Zuweisung der Variablen:

    label_level.Text = character.Attribute("name").Value;
    

    Um die Attribute aller Elemente in einer Zeile darzustellen, könntest Du bspw. wie folgt vorgehen:

          foreach (XElement character in characters)
          {
            StringBuilder line = new StringBuilder();
    
            foreach (XAttribute att in character.Attributes())
            {
              line.Append(att.Value + "; ");
            }
    
            listBox5.Items.Add(line.ToString());
          }

    Das Prinzip sollte jetzt aber klar sein, oder?



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Sonntag, 8. November 2009 19:27

Alle Antworten

  • Hallo Travian,

    leider sagst Du uns nicht, mit welchen Methoden Du bisher versucht hast, das XML File zu lesen oder gar anzuzeigen.

    Hier mal ein Beispiel, das LINQ To XML nutzt, um die Attribute der "character" Elemente zu lesen und in einer Konsolenanwendung auszugeben:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          XDocument xml = XDocument.Load(@"file://D:\Temp\testfile.xml");
    
          var characters = from c in xml.Descendants("character") select c;
    
          foreach (XElement character in characters)
          {
            Console.WriteLine("=== {0} ===", character.Name);
    
            foreach (XAttribute att in character.Attributes())
            {
              Console.WriteLine("{0} => {1}", att.Name, att.Value);
            }
          }
    
          Console.Read();
        }
      }
    }

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Samstag, 7. November 2009 13:32
  • Hi danke deine Idee ist Spitze nur verstehe ich nicht ganz was genau da passiert.

    Da ich ja dann jedes XAttribut nach deinem Code in einer Variable haben möchte.

     Console.WriteLine("{0} => {1}"
    
    
    , att.Name, att.Value);
    Auch wenns nun doof kling bin noch nicht sehr erfahren was Arrays und Verarbeitung angeht.

    Die software soll später die fähigkeit besitzen in jeden des in character vorhanden eintrag einer person zuzuweisen also eine art fortlaufende id für die Variable.
    In der ich dann die archPoints usw des jeweiligen abrufen kann. Ist sowas überhaubt möglich ?
    Mit andern Worten eine Suchmaske mit der ich nach "name" oder "raceId" suchen kann und dann die jeweiligen einträge sehen kann zb in einem label.
    Wichtig wäre halt bei einer Suche wie zb nach "raceId" das ich 2 Dinge sehen möchte.

    1 Alle einträge mit der übereinstimmenden "raceId"
    2 Und ihre dazugehörigen Daten sätze.

    Falls das was ich mir vorstelle nicht möglich ist werde ich das Projkt wohl aufgeben. Dein Ansatz hat mich denoch weitergebracht.

    Mfg Travian
    Samstag, 7. November 2009 14:00
  • Hallo Travian,

    das Beispiel sucht sich alle "character" Elemente aus dem vorliegenden XML heraus. Danach durchläuft es die einzelnen Attribute dieser Elemente und gibt sie mit Namen und Wert auf der Konsole aus. Arrays sind da nicht im Spiel.

    Wenn Du jetzt nur einen einzelnes Attribut lesen und einer Variable zuordnen möchtest, machst Du das über die Attribute() Methode des XElement:

    string name = character.Attribute("name").Value;


    Wenn Du nur Elemente suchst, die bestimmte Attribute aufweisen, kannst Du das direkt über die LINQ Abfrage einschränken. In folgendem Beispiel werden nur noch "character" Elemente zurückgegeben mit der "raceId" 11:

    var characters = from c in xml.Descendants("character")
                           where
                             c.Attribute("raceId").Value == "11"
                           select c;

    Eine Referenz zum Einlesen bietet die MSDN:

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Samstag, 7. November 2009 16:35
  • OK vielen Dank ich habe noch eine letzte Frage dann müsste ich mein Projekt umsetzen können.

    Wie kann ich die Daten ausgabe Formatieren Zurzeit habe ich die Ausgabe immer so gemacht.
     foreach (XAttribute att in characters.Attributes())
                {
                    listBox5.Items.Add(att.Value);
                }
    Das ergebnis ist aber dann:
    achPoints
    3510
    classId
    6
    genderId
    0
    level
    80
    
    usw.

    Da ich ein Form machen möchte mit Labeln zb.
    label_level.text = ????

    darin soll dann das Level auftauchen.

    und die restergebnisse falls mehr als 1 auf den suchstring auftreffen wieder in die listbox nur vlt in einer zeile nicht alles untereinander.
    Geht das ?
    Sonntag, 8. November 2009 14:10
  • Wenn Du einen bestimmten Wert in einem Label darstellen möchtest, kannst Du den über die Attribute-Methode abfragen und dem Label.Text zuweisen, so wie schon bei der Zuweisung der Variablen:

    label_level.Text = character.Attribute("name").Value;
    

    Um die Attribute aller Elemente in einer Zeile darzustellen, könntest Du bspw. wie folgt vorgehen:

          foreach (XElement character in characters)
          {
            StringBuilder line = new StringBuilder();
    
            foreach (XAttribute att in character.Attributes())
            {
              line.Append(att.Value + "; ");
            }
    
            listBox5.Items.Add(line.ToString());
          }

    Das Prinzip sollte jetzt aber klar sein, oder?



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Sonntag, 8. November 2009 19:27