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
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 🙁
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
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.
Hallo Robin,
XPath ist sicherlich die bessere Wahl. In diesem Fall muss meine Applikation allerdings mit .NET 2.0 kompatibel sein.
Ten
Hallo tentod,
was hat XPath mit der Version des .Net Framework, bzw. mit .Net überhaupt zu tun? Ich verstehe deinen Kommentar nicht.
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
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.
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.
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
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code