2016-06-28 14 views
-2

Ich habe versucht, XML in C# Visual Studio zu lesen, aber wusste nicht, wie es sehr gut geht. Zuerst habe ich versucht, einen Block, wenn, wie folgt aus:Wie lese ich eine XML-Datei (einfach)

if (ReadToNextDescendant("painted_blue")) 
{ 
    // access the coordinates inside and do some work 
    // this works 
} 

Es funktionierte, und ich war in der Lage, die Daten aus den gemalten blauen Koordinaten zu extrahieren. Ich habe es jedoch erneut für die walls_horizontal versucht und es hat nicht funktioniert. Daher kam ich zu dem Schluss, dass ich eine neue Funktion oder vielleicht einen anderen Ansatz brauche. Ich bin jedoch nicht im XML-Parsing versiert. Zum einen verstehe ich nicht genau, was ReadToDescendant tut und warum es beim zweiten Mal nicht funktioniert hat. Könnte mir jemand in die richtige Richtung zeigen?

<painted_blue> 
    (0,0) 
    (1,0) 
    (1,5) 
    (2,2) 
</painted_blue> 

<walls_horizontal> 
    (1,2) 
    (1,3) 
    (1,4) 
    (2,1) 
    (2,2) 
</walls_horizontal> 

<walls_vertical> 
    (1,1) 
    (1,2) 
    (1,3) 
    (2,0) 
    (2,1) 
</walls_vertical> 

+9

Es sieht aus wie 'ReadToNextDescendant' ist eine Methode in Ihrer eigenen Klasse, vorausgesetzt, Sie rufen es nicht auf irgendetwas. Es würde wirklich helfen, wenn du ein [mcve] zur Verfügung stellen würdest. Aber im Allgemeinen würde ich vorschlagen, LINQ zu XML zu verwenden, wenn Sie mit XML arbeiten. Die aktuelle Struktur Ihres XML ist jedoch sehr unglücklich - es sieht so aus, als ob jedes dieser Elemente 5 Unterelemente haben sollte. –

+1

Suchen Sie die XElement-Klasse. Es ist sehr nützlich für diese Art von Dingen und ist Teil von dem, auf den Jon Skeet Bezug nimmt, wenn er von LINQ zu XML spricht. Sie sollten auch, wie Jon Skeet sagt, Ihr XML so korrigieren, dass diese Koordinaten Unterelemente mit möglicherweise x- und y-Attributen sind. – Jakotheshadows

+0

Bemerkenswert und hinzufügen: Ihr XML ist nicht gültig XML. –

Antwort

1

Wenn Sie kann ich würde wirklich das XML-Format zu so etwas wie dies empfiehlt Wechsel:

<walls_horizontal> 
    <coord x="1" y="2" /> 
    <coord x="1" y="3" /> 
    <coord x="1" y="4" /> 
</walls_horizontal> 

mit Knoten für die Koordinaten machen ist viel einfacher managen. Hier

ist ein Code

public static XmlReaderSettings ReaderSettings() 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.CloseInput = true; 
    settings.IgnoreComments = true; 
    settings.IgnoreProcessingInstructions = true; 
    settings.IgnoreWhitespace = true; 
    return settings; 
} 

... wo immer Sie in der Datei lesen

Stream stream = File.Open(filePath, FileMode.Open); 

    var reader = XmlReader.Create(stream, XmlHelper.ReaderSettings()); 



    if (!reader.IsEmptyElement) 
      { 
       string tagName = reader.Name; 

       while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement)) 
       { 
        if (reader.NodeType == XmlNodeType.Element) 
        { 
         switch (reader.Name) 
         { 
          case "wall_horizontal": 
           var coord = new Coord(reader); 
           break; 

         } 
        } 
       } 
      } 

In einem benutzerdefinierten Koordinaten Klasse so etwas wie:

public Coord(XmlReader reader) 
    { 
     if (reader == null) throw new ArgumentNullException("reader"); 

     if (!reader.IsEmptyElement) 
     { 
      string tagName = reader.Name; 

      while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "coord")) 
      { 
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        switch (reader.Name) 
        { 
         case "coord": 
          var x = reader.GetAttribute("x"); 
          var y = reader.GetAttribute("y"); 
          break; 
        } 
       } 

     } 
     } 
    } 

Dann tun etwas mit deinen x- und y-Werten. Dieser Code ist Kesselplatte für was ich verwende. Der Code muss möglicherweise etwas überarbeitet werden, um mit Ihrer Situation zu arbeiten. Ich hoffe, es weist Sie in die richtige Richtung!