Benutzer mit den meisten Antworten
XmlReader.GetAttribute() liest keinen Wert!!!

Frage
-
Hallo,
mein XML-Datei sieht wie folgt aus:
<?xml version="1.0" encoding="utf-8"?> <Dateien> <standort> <bezeichnung>Zugewiesen</bezeichnung> <datei pfad="STAN/Test.sav">hall.sav</datei> </standort> </Dateien>
wenn ich aber über folgendes Befehl den Attribut pfad in der Element datei lesen will bekomme keinen Wert als Antwort:
string att = ""; if (XMLDatei.Name == "datei") att = XMLDatei.GetAttribute("pfad");
Kann jemand mir vielleicht bitte weiterhelfen, was ich falsch mache?
Gruesse, NUNUI
Antworten
-
Hi,
bei mir funktioniert dein Code einwandfrei. Ich erhalte als Ergebnis "STAN/Test.sav".
Hast Du mal einen Breakpoint auf die Zeile mit att = XMLDatei.GetAttribute( "pfad" ) gesetzt und geschaut, was passiert?
Schau auch mal genau, was in xmlString wirklich steht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 13. September 2016 17:28
- Als Antwort markiert Nunui Dienstag, 13. September 2016 22:22
Alle Antworten
-
Hi,
wo kommt denn "XMLDatei" her? Mit dem wenigen Code kann man leider nicht so wirklich was anfangen.
Falls das aber alles ist, was in den einzelnen Nodes vorkommen kann, wäre XML Serialisierung für dich evtl. die bessere Wahl. Damit kannst Du dir eine Klassenstruktur erstellen (oder auch über XSD.exe erstellen lassen), die den Aufbau der XML Inhalt abbildet und dann sehr einfach auf die Objekte und Werte zugreifen.
Deine Datenklassen für diese Abbildung würden dabei bspw. so aussehen:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; namespace DeinNamespace { [Serializable] [XmlRoot( "Dateien" )] public class Root { [XmlElement( "standort" )] public List<Location> Locations { get; set; } public Root() { } } [Serializable] [XmlRoot( "standort" )] public class Location { [XmlElement( "bezeichnung" )] public String Description { get; set; } [XmlElement( "datei" )] public File File { get; set; } public Location() { } } [Serializable] [XmlRoot( "datei" )] public class File { [XmlAttribute( "pfad" )] public String Path { get; set; } [XmlText()] public String Text { get; set; } public File() { } } }
Die eigentliche Umwandlung der XML Datei in deine Objektstruktur erfolgt dann so:
Root root = Helper.DeserializeObject<Root>( @"X:\Ordner\Datei.xml" );
Anschließend hast Du in "root" alles drinstehen, also alle Standorte, deren Bezeichnung, Datei, Pfad, usw.
---
Falls Du mit XML Serialisierung/Deserialisierung arbeiten willst, musst Du einmal ein paar generische Methoden bei dir einbinden (sind universell nutzbar, also auch für so gut wie alles andere, was sich per XML serialisieren lässt)
public static void SerializeObject<T>(string FileName, T DataObject) { XmlSerializer Serializer = new XmlSerializer(typeof(T)); FileStream FileStream = new FileStream(FileName, FileMode.Create); XmlTextWriter TextWriter = new XmlTextWriter(FileStream, Encoding.UTF8); TextWriter.Indentation = 4; TextWriter.IndentChar = ' '; TextWriter.Formatting = Formatting.Indented; Serializer.Serialize(TextWriter, DataObject); TextWriter.Close(); FileStream.Close(); FileStream.Dispose(); } public static string SerializeObject<T>(T DataObject) { string Result = null; XmlSerializer Serializer = new XmlSerializer(typeof(T), string.Empty); MemoryStream MemoryStream = new MemoryStream(); XmlTextWriter TextWriter = new XmlTextWriter(MemoryStream, Encoding.UTF8); TextWriter.Indentation = 4; TextWriter.IndentChar = ' '; TextWriter.Formatting = Formatting.Indented; XmlSerializerNamespaces XmlNamespace = new XmlSerializerNamespaces(); XmlNamespace.Add(string.Empty, string.Empty); Serializer.Serialize(TextWriter, DataObject, XmlNamespace); Result = Encoding.UTF8.GetString(MemoryStream.ToArray()); TextWriter.Close(); MemoryStream.Close(); MemoryStream.Dispose(); return Result; } public static T DeserializeObject<T>(string FileName) { T Result = default(T); XmlSerializer Serializer = new XmlSerializer(typeof(T)); FileStream FileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read); XmlTextReader TextReader = new XmlTextReader(FileStream); Result = (T)Serializer.Deserialize(TextReader); TextReader.Close(); FileStream.Close(); FileStream.Dispose(); return Result; } public static T DeserializeString<T>(string XmlContent) { T Result = default(T); string XmlContentToParse = null; if (XmlContent.StartsWith("?")) { XmlContentToParse = XmlContent.Substring(1); } else { XmlContentToParse = XmlContent; } XmlSerializer Serializer = new XmlSerializer(typeof(T)); StringReader StringReader = new StringReader(XmlContentToParse); Result = (T)Serializer.Deserialize(StringReader); StringReader.Close(); StringReader.Dispose(); return Result; }
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 13. September 2016 16:45
-
Erstmal Danke für die Antwort :o)
Es handelt sich dabei um einem Silverlight-Projekt und mein Code sieht wie folgt aus: (bei xmlString handelt es sich um Inhalt von XML-Datei)XmlReader XMLDatei; string att = ""; using (XMLDatei = XmlReader.Create(new StringReader(xmlString))) { while (XMLDatei.Read()) { switch (XMLDatei.NodeType) { case XmlNodeType.Element: if (XMLDatei.Name == "datei") att = XMLDatei.GetAttribute("pfad"); break; } } }
Gruesse, NUNUI
-
Hi,
bei mir funktioniert dein Code einwandfrei. Ich erhalte als Ergebnis "STAN/Test.sav".
Hast Du mal einen Breakpoint auf die Zeile mit att = XMLDatei.GetAttribute( "pfad" ) gesetzt und geschaut, was passiert?
Schau auch mal genau, was in xmlString wirklich steht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 13. September 2016 17:28
- Als Antwort markiert Nunui Dienstag, 13. September 2016 22:22
-
Schau auch mal genau, was in xmlString wirklich steht.
Danke für den Hinweis!!!
ich habe in einer andere Methode xmlString weiterbearbeitet und hatte vergessen den Attribut einzutragen:
writer.WriteAttributes(reader, false);
Jetzt funktioniert es und vielen Dank für eure Unterstützung :o)
Gruesse, NUNUI