Hallo @ all.
Ich bin gerade dabei ein XML Dokument zu laden und dort ein bestimmtes Attribute in eine Variable zu speichern.
Die Struktur des XML Dokumentes sieht folgendermaßen aus:
<eModel:Space>
_______<eModel:Units>
_______<eModel:Resources>
_____________<eModel:GraphicResource>
____________________<eModel:Properties id="xxx">
...
Über lauter foreach und if Schleifen bekomme ich dieses Attribut auch ausgelesen. Hier mal der Code:
XmlDocument descriptor = new XmlDocument();
descriptor.Load(mainFolder + @"\descriptor.xml");
string id = "";
XmlNode rootDescriptor = descriptor.DocumentElement;
foreach (XmlNode nodeDescriptor in rootDescriptor.ChildNodes) {
if (nodeDescriptor.Name == "eModel:Resources") {
foreach (XmlNode node2Descriptor in nodeDescriptor.ChildNodes) {
if (node2Descriptor.Name == "eModel:GraphicResource") {
foreach (XmlNode node3Descriptor in node2Descriptor.ChildNodes) {
if (node3Descriptor.Name == "eModel:Properties") {
id = node3Descriptor.Attributes["id"].InnerText;
}
}...
Das ist natürlich total unübersichtlich 😦 Ich habe bereits eine einfachere Variante gesehen, nämlich mittels "SelectSingleNode". Das hatte ich folgendermaßen probiert:
XmlDocument descriptor = new XmlDocument();
descriptor.Load(mainFolder + @"\descriptor.xml");
XmlNode properties = descriptor.SelectSingleNode("/eModel:Space/eModel:Resources/eModel:GraphicResources/eModel:Properties");
string id = properties.Attribute["id"].InnerText;
MessageBox.Show(id);
Aber ich erhalte immer eine Fehlermeldung: "XPathException wurde nicht behandelt" 😦
Was mache ich falsch? Ist sicherlich nur ein kleiner Fehler?!?! Wäre schön, wenn jemadn helfen könnte. Das andere funktioniert ja auch, aber ist halt deutlich mehr Code!!!
Danke im Vorraus.
Lg Luna
Dir fehlt wahrscheinlich der XmlNamespace, da dein XML-File ja einen verwendet. Versuch mal folgendes:
XmlNamespaceManager man = new XmlNamespaceManager(new NameTable());
man.AddNamespace("eModel", "DWF-eModel:1.0");
XmlNode properties = descriptor.SelectSingleNode("eModel:Space/eModel:Resources/eModel:GraphicResources/eModel:Properties", man);
Oder aber den Namespace aus dem XML-File entfernen und den Code entsprechend anpassen.
Quick-and-dirty:
String id = XElement.Parse(File.ReadAllText(FULL_QUALIFIED_XML_PATH)).
Descendants(XNamespace.Get("DWF-eModel:1.0") + "Properties").First().Attribute("id").Value;
Tut mir leid, dass ich jetzt erst antworte, aber hatte total vergesse mal zu gucken ob Antworten da sind 😉
Danke für eure Hilfe!!! Hat geklappt 🙂