Laden...

trivialer Zugriff auf XML Attribute

Erstellt von tentod vor 13 Jahren Letzter Beitrag vor 10 Jahren 5.928 Views
T
tentod Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren
trivialer Zugriff auf XML Attribute

Hallo,
ich habe ein Problem auf Attribute innerhalb einer XML-Datei zuzugreifen.

Folgende Situation:

<?xml version='1.0' encoding="utf-8" standalone="yes"?>
<section name="List"> 
    <entry name="Home">
        <detail name="IP">192.168.0.1</detail>
        <detail name="Server">localhost</detail>        
    </entry>
    <entry name="Outside">        
        <detail name="IP">192.168.32.215</detail>
        <detail name="Server">fileserver</detail>
    </entry> 
</section>

Die XML-Datei lese ich wie folgt ein.


String configFile = Directory.GetCurrentDirectory() + "\\config.xml";
XmlDocument documentation = new XmlDocument();
documentation.Load(configFile);
XmlNodeList memberNodes = documentation.SelectNodes("/section[@name='List']");

foreach (XmlNode node in memberNodes)
{
	foreach (XmlNode innerNode in node.ChildNodes)
	{
	    Console.WriteLine("Found XML entry: node {0}\t value: {1}", innerNode.Name, innerNode.InnerText);	    
	    XmlNodeList nList = innerNode.ChildNodes;

	    foreach(XmlNode n in nList) {		
		     Console.WriteLine("\tFound XML entry: node {0}\t value: {1}", n.Name, n.InnerText);
	    }
	}
}

Auf welche Weise kann ich innerhalb der foreach-Schleife die Attributnamen abfragen?
z.B. möchte ich innerhalb der Schleife auswerten, welches detail-Tag gerade eingelesen wurde (name="IP" oder name="Server").

Vielen Dank für eure Hilfe.

Ten

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

@tentod:
In XmlNode gibt es die Property Attributes. Dort sind alle Attribute des Nodes aufgelistet.

EDIT: Noch einfacher wird es, wenn du XmlNode in XmlElement castest, dann hast du eine Methode GetAttribute.

Nobody is perfect. I'm sad, i'm not nobody 🙁

R
68 Beiträge seit 2010
vor 13 Jahren

Hallo,
für so etwas verwende ich immer gerne XDocument:


static void Main(string[] args)
        {
            XDocument xdoc;
            xdoc = XDocument.Load(@"D:\test.xml");

            IEnumerable<XElement> xmlItems = xdoc.Root.Elements(); 

            foreach (XElement xmlItem in xmlItems)
            {
                Console.WriteLine(xmlItem.Elements().ElementAt(0).Attribute("name").Value.ToString()); // IP 
                Console.WriteLine(xmlItem.Elements().ElementAt(1).Attribute("name").Value.ToString()); // Server 
                Console.WriteLine(xmlItem.Elements().ElementAt(0).Value.ToString()); // IP Inhalt
                Console.WriteLine(xmlItem.Elements().ElementAt(1).Value.ToString()); // Server Inhalt
            }
        }

Finde ich persönlich klarer und strukturierter als das ganze Node- und Child-
Gehüpfe.

Robin

T
tentod Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Hallo tom,
vielen Dank für deine Hilfe. So einfach kann das sein.

Ten

M
17 Beiträge seit 2010
vor 13 Jahren

Hallo,
in deinem XPath Statement greifst du doch schon auf ein Attribut zu. Was genau möchtest du denn erreichen? Ich persönlich finde die Selektion von Attributen (oder gleich deren Werten) über XPath sehr sauber und flexibel.

T
tentod Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Hallo Robin,
XPath ist sicherlich die bessere Wahl. In diesem Fall muss meine Applikation allerdings mit .NET 2.0 kompatibel sein.

Ten

M
17 Beiträge seit 2010
vor 13 Jahren

Hallo tentod,
was hat XPath mit der Version des .Net Framework, bzw. mit .Net überhaupt zu tun? Ich verstehe deinen Kommentar nicht.

T
tentod Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Hallo,
du hast recht, ich habe mich unklar ausgedrückt.
Mit meinem Kommentar an RBA285 meine ich etwas anderes. Der von RBA285 dargestellte Code enthält die XDocument Klasse. Diese Klasse ist in .NET 2.0 noch nicht verfügbar.

Ten

M
17 Beiträge seit 2010
vor 13 Jahren

Alles klar...habe verstanden.
Hast du dein Problem denn mittlerweile gelöst? Ansonsten wäre mir noch eingefallen (wenn die XML Datei immer gleich ist, also implizit oder sogar explizit einem Schema genügt), dass du die XML Datei doch deserialisieren könntest. Dann kannst du ganz einfach auf die entsprechenden Properties in den deserialisierten Klassen zugreifen. LinQ to XML kommt bei dir wg. der 2.0 Restriktion nicht in Frage.
XPath kannst du aber natürlich auch in .NET 2.0 verwenden! Stichwort XPathDocument oder auch die "große Variante": XmlDocument.

S
5 Beiträge seit 2013
vor 10 Jahren

Hallo,

ich greife diesen etwas älteren Thread auf da er mir wirklich weitergeholfen hat meine xml datei auszulesen und Steuerelmente mit Attributen zu füllen.

mit folgendem Code:

  XDocument xdoc;
            xdoc = XDocument.Load(Application.StartupPath + "\\Objektive.xml");


            IEnumerable<XElement> xmlItems = xdoc.Root.Elements();

            foreach (XElement xmlItem in xmlItems)
            {
                
                //Objektiv Bezeichnung einfügen
                label1.Text = (xmlItem.Elements().ElementAt(0).Value.ToString());
                //m Label als m bezeichnen
                mLabel.Text = (xmlItem.Elements().ElementAt(2).Attribute("name").Value.ToString());
                //Wert für "m" in TxtBox schreiben
                mtxtBox.Text = (xmlItem.Elements().ElementAt(2).Value);

                bLabel.Text = (xmlItem.Elements().ElementAt(3).Attribute("name").Value);
                btxtBox.Text = (xmlItem.Elements().ElementAt(3).Value);

                deltaLLabel.Text = (xmlItem.Elements().ElementAt(4).Attribute("name").Value);
                deltatxtBox.Text = (xmlItem.Elements().ElementAt(4).Value); 


                

            }

Ist es möglich auf Grundlagen der XDocument Klasse eine Combobox mit Attributen zu füllen? Und wenn ja wie? Ich steh etwas auf dem Schlauch, habe jetzt schon einige zeit damit zugebracht.

Vielen Dank im voraus.

5.657 Beiträge seit 2006
vor 10 Jahren

Hi snchspae,

Ich steh etwas auf dem Schlauch, habe jetzt schon einige zeit damit zugebracht.

Was hast du probiert? Was funktioniert dabei nicht? Wo können wir dir helfen?
Siehe auch [Hinweis] Wie poste ich richtig? , Punkt 5 "Problem genau beschreiben - inkl. genauer Fehlermeldung - und konkrete Fragen stellen".

Christian

Weeks of programming can save you hours of planning

S
5 Beiträge seit 2013
vor 10 Jahren

Ersteinmal hier meine xml datei:

<section name="Objektive">
  <entry name="Daten">
   <detail SachNr="Sachnummer">421452-9980-000</detail>
    <detail m="m">-36.39</detail>
    <detail b="b">0.05</detail>
  </entry>
  <entry name="Daten">
    <detail SachNr="Sachnummer">421452-9900-000</detail>
    <detail m="m">-36.39</detail>
    <detail b="b">0.05</detail>
  </entry>
</section>

Nun möchte ich gerne eine Combobox über

cb1.Items.add() mit den obrigen Sachnummern füllen.

cb1.Items.add(xmlitem.Elements().ElementsAt().Attribute("SachNr").Value);

war meine Vorstellung aber funktioniert leider nicht so wie ich es gerne hätte.

Da der index sich in Zukunft evtl änder wird.

16.807 Beiträge seit 2008
vor 10 Jahren

Trenne Deinen Code sauber. Das heißt: Oberfläche von Datenschicht trennen.
Serialisiere Deine XML in Klassen, die die XML repräsentieren.

Was Du hier machst ist alles andre als modulares entwickeln und erzeugt dann oft solche Probleme.