2016-10-04 3 views
1

Also, ich habe XML wie folgt aus:C# XML-Parsing - Get Attribut des untergeordneten Knoten

<tileset firstgid="1" name="simple_tiles" tilewidth="32" tileheight="32" tilecount="16" columns="8"> 
    <image source="../Users/mkkek/Pictures/rpg/default_tiles_x.png" width="256" height="64"/> 
</tileset> 

Als ich im tileset Knoten bin, wie kann ich Zugriff auf den image Knoten und seine source Attribut? Mein Code ist wie folgt:

public void LoadMaps(ContentManager content) 
    { 
     Dictionary<string, string> mapsToLoad = InitMapsToLoad(); 

     foreach (KeyValuePair<string, string> mapToLoad in mapsToLoad) 
     { 
      Map map = new Map(); 
      map.Name = Path.GetFileNameWithoutExtension(mapToLoad.Value); 

      reader = XmlReader.Create("Content/" + mapToLoad.Value); 

      while(reader.Read()) 
      { 
       if(reader.NodeType == XmlNodeType.Element) 
       { 
        switch(reader.Name) 
        { 
         case "tileset": 
          if(!Tilesets.Any(ts => ts.Name == reader.GetAttribute("name"))) 
          { 
           // handling the image node here 
          } 
          break; 
        } 
       } 
      } 
     } 
    } 
+0

Gibt es einen Grund, dass Sie XmlReader und keine verwenden t LINQ zu XML? – YuvShap

+0

Nein, sollte ich das verwenden? Es scheint, dass ich nicht auf den Namensraum 'System.Xml.Linq' zugreifen kann. – mkkekkonen

+0

Jetzt habe ich es gefunden, ich musste es als Referenz hinzufügen. – mkkekkonen

Antwort

0

Ich ziehe es in der Regel LINQ to XML zu verwenden, weil ich es API finden viel einfacher zu bedienen als XmlReader, einen Vergleich zwischen den Technologien here.

Wenn alles, was Sie brauchen, ist Quelle Attributwert von Bildelement immer dies leicht erreicht werden kann:

var doc = XDocument.Load("something.xml"); 
var root = doc.DocumentElement; 
var imageElements = root.Elements("image").ToList(); 
foreach (var imageElement in imageElements) 
{ 
    var sourceAttribute = imageElement.Attribute("source"); 
    var sourceValue = sourceAttribute.Value; 
    //do something with the source value... 
} 

Mehr über grundlegende Abfragen in LINQ to XML here.

0

Sie sind fast fertig. Fügen Sie dies Ihrem Code hinzu.

// handling the image node here 
if (reader.ReadToDescendant("image")) 
{ 
    string source = reader.GetAttribute("source"); 
} 
0

Ich werde vorschlagen, einige Klassen zu erstellen, die die XML-Struktur darstellt, so etwas wie dieses:

[XmlRoot(ElementName = "image")] 
    public class Image 
    { 
     [XmlAttribute(AttributeName = "source")] 
     public string Source { get; set; } 
     [XmlAttribute(AttributeName = "width")] 
     public string Width { get; set; } 
     [XmlAttribute(AttributeName = "height")] 
     public string Height { get; set; } 
    } 

    [XmlRoot(ElementName = "tileset")] 
    public class Tileset 
    { 
     [XmlElement(ElementName = "image")] 
     public Image Image { get; set; } 
     [XmlAttribute(AttributeName = "firstgid")] 
     public string Firstgid { get; set; } 
     [XmlAttribute(AttributeName = "name")] 
     public string Name { get; set; } 
     [XmlAttribute(AttributeName = "tilewidth")] 
     public string Tilewidth { get; set; } 
     [XmlAttribute(AttributeName = "tileheight")] 
     public string Tileheight { get; set; } 
     [XmlAttribute(AttributeName = "tilecount")] 
     public string Tilecount { get; set; } 
     [XmlAttribute(AttributeName = "columns")] 
     public string Columns { get; set; } 
    } 

Dann In einigen Utility-Klasse fügen die folgende Methode:

public static T DeserializeFromXml<T>(string xml) 
    { 
     if (string.IsNullOrEmpty(xml)) 
     { 
      return default(T); 
     } 

     var serializer = new XmlSerializer(typeof(T)); 
     T entity; 

     using (XmlReader reader = XmlReader.Create(new StringReader(xml))) 
     { 
      entity = (T)serializer.Deserialize(reader); 
     } 

     return entity; 
    } 

Jetzt können Sie Zugriff auf das Image-Objekt mit dem folgenden Code:

Tileset tileset=DeserializeFromXml<Tileset>(yourXmlContent); 
// now you can access the image from the tileset instance 'tileset.Image.Source' 
Verwandte Themen