Announcement

Collapse
No announcement yet.

verschachtelte XML-Daten mit Attributen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • verschachtelte XML-Daten mit Attributen

    Ich habe hier ein vorhandenes altes Programm das unter anderem folgenden Sermon in XML ablegt:

    Code:
    <paths>
    	<path set="1">A
    		<path set="1">E
    		</path>
    		<path set="0">B
    			<path set="0">C
    				<path set="1">F
    				</path>
    			</path>
    			<path set="1">D
    			</path>
    		</path>
    	</path>
    </paths>
    Dies ist nur ein einfaches Beispiel und die Formatierung habe ich händisch hinzugefügt. Tatsächlich wird das alles in einer Zeile ohne Leerstellen gespeichert.

    Diese Daten repräsentieren folgende Pfade, die das Programm speichert:

    A
    A\E
    A\B\D
    A\B\C\F

    Die Verzeichnisnamen (A, B, C ...) werden als Daten für das Tag "path" abgelegt. Aber nur Tags mit den Attribut 'set="1"' bedeuten ein Pfadende (Die Pfade "A\B" und "A\B\C" sind nicht gesetzt, werden aber zur Speicherung der Pfade "A\B\D" und "A\B\C\F" gebraucht.

    Klingt fürchterlich kompliziert und ist es für mich leider auch :-(

    Hat jemand eine Idee für eine Funktion, die die XML in eine Array of Strings oder etwas anderes handlicheres verwandelt?

    Danke fürs lesen, Uwe

  • #2
    Poste mal ein Beispiel der originalen Eingabedaten ohne Formatierung und erzähle uns, ob du .NET 3.5 oder 4.0 und damit LINQ benutzen kannst.

    Comment


    • #3
      Angenommen wir haben das XML-Dokument
      Code:
      <?xml version="1.0" encoding="utf-8" ?>
      <paths xml:space="preserve"><path set="1">A<path set="1">E</path><path set="0">B<path set="0">C<path set="1">F</path></path><path set="1">D</path></path></path></paths>
      dann kann man mit .NET 3.5 oder 4.0 und LINQ to XML folgendes machen:
      Code:
                  XElement paths = XElement.Load("../../XMLFile1.xml");
      
                  List<string> pathList =
                      (from path in paths.Descendants("path")
                       where (int)path.Attribute("set") == 1
                       select path.AncestorsAndSelf("path").InDocumentOrder().Aggregate(new StringBuilder(), (sb, p) => sb.Append((p.FirstNode as XText).Value + "\\"), sb => sb.Remove(sb.Length - 1, 1).ToString())).ToList();
      
                  foreach (string path in pathList)
                  {
                      Console.WriteLine(path);
                  }
      Ausgabe ist dann
      Code:
      A
      A\E
      A\B\C\F
      A\B\D

      Comment


      • #4
        Boah! Da wäre ich im leben nicht drauf gekommen. Danke!

        Comment

        Working...
        X