| 

.NET C# Java Javascript Exception

1
Hallo,
hat jemand C#-Beispiel-Code, wie man einen XML-Baum mit beliebiger Tiefe rekursiv auslesen kann?

Viele Grüsse,
shabi
07.07.2011
shabi 159 1 3
1 Antwort
0
Hallo,

prinzipiell ist der Code für die Traversierung immer identisch, es hängt lediglich davon ab, in welcher Darstellung Du dein Xml hast. Ich habe ein Beispiel entwickelt, das einmal DOM und einmal Linq2Xml als Darstellungsformen für das XML verwendet. Traversierung ist bis auf den Knotentyp und Methode zum Abrufen der Kinder eines Knotens gleich.

public class ReadXml
{
public static string GetTestData()
{
return "<root><child1><grandchild1_1></grandchild1_1></child1><child2><grandchild2_1></grandchild2_1><grandchild2_2></grandchild2_2></child2></root>";
}

public static void ReadUsingDom()
{
string testdata = GetTestData();

XmlDocument doc = new XmlDocument();
doc.InnerXml = testdata; // etwas grob, aber fürs Beispiel ausreichend
Traverse(doc);
}

public static void ReadUsingLinq2Xml()
{
string testdata = GetTestData();

XDocument doc = XDocument.Parse(testdata);
Traverse(doc.Element("root"));
}

private static void Traverse(XmlNode node)
{
Console.WriteLine(node.Name);

foreach (XmlNode child in node.ChildNodes)
{
Traverse(child);
}
}

private static void Traverse(XNode node)
{
Console.WriteLine(node.ToString());

foreach (var child in node.NodesAfterSelf())
{
Traverse(child);
}
}

static void Main(string[] args)
{
ReadUsingDom();
ReadUsingLinq2Xml();

Console.ReadKey();
}
}


Mithilfe von Funktoren kann man sich in der Traversierung von der Darstellungsform unabhängig machen. Dazu übergibt man eine Action, die auf jeder Node während der Traversierung aufgerufen werden soll und einen Funktor, der die Kinder eines Knotens auswählt.
Das könnte dann so aussehen:

public class ReadXml2
{
public static string GetTestData()
{
return "<root><child1><grandchild1_1></grandchild1_1></child1><child2><grandchild2_1></grandchild2_1><grandchild2_2></grandchild2_2></child2></root>";
}

private static void Traverse<TNode>(TNode node, Action<TNode> visitAction, Func<TNode, IEnumerable<TNode>> childSelector)
{
visitAction(node);

foreach (TNode child in childSelector(node))
{
Traverse(child, visitAction, childSelector);
}
}

static void Main(string[] args)
{
string testdata = GetTestData();
XNode doc = XDocument.Parse(testdata);

Traverse(doc,
node => Console.WriteLine(node.ToString()),
node => node.NodesAfterSelf());

Console.ReadKey();
}
}


Viel Spass damit,
Florian
07.07.2011
ffordermaier 8,4k 3 9

Stelle deine Xml-Frage jetzt!