XML / Wie kommt XML überhaupt zustande?

Wie kommt XML überhaupt zustande?

Wie kommt XML überhaupt zustande?

➪ Es gibt zahlreiche Möglichkeiten, XML automatisiert zu generieren.

Auf dieser Seite:

XML fällt nicht vom Himmel. Auch fällt nur selten jemandem ein, XML von Hand zu schreiben. In der Regel sorgen spezielle Programme dafür, dass XML automatisch generiert wird. Diese Programme können in jeder denkbaren Sprache geschrieben werden, sowohl als rein sequenzieller Text (wobei auf die Wohlgeformtheit der Ergebnisdokumente zu achten ist), im Rahmen der DOM-Programmierung, aus Datenbankabfragen oder beliebigen Datenkonvertierungen.

Aus der großen Fülle verfügbarer Alternativen habe ich hier nur die .NET-Klassen XmlTextWriter und XmlDocument ausgesucht. Weitere Beispiele aus dem Java-Umfeld finden Sie unter und .

XML mit XmlTextWriter in VB.NET generieren

Der XmlTextWriter, hier in der Ausführung mit VB.NET, generiert sequenziell ein Namespace-behaftetes Root-Element mit zehn Childnodes.


  Public Sub XMLTextWriterDemo()
    Console.WriteLine("XMLTextWriter START")
    Try
      Dim w As New XmlTextWriter("vbnetbeispiel.xml", 
                                  Text.Encoding.UTF8)
      w.WriteStartDocument(True)
      w.WriteWhitespace(vbCrLf)
      w.WriteStartElement("wg", 
                          "myROOT", 
                          "www.wilfried-grupe.de")
      For i As Integer = 1 To 10
        w.WriteElementString("wert", i)
        w.WriteWhitespace(vbCrLf)
      Next
      w.WriteEndElement()
      w.WriteEndDocument()
      w.Close()
      Console.WriteLine("XMLTextWriter STOP")
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    End Try
  End Sub

XML mit XmlDocument in C#.NET generieren

In der .NET-Klasse XmlDocument wird der XML-Baum im Arbeitsspeicher komplett erzeugt und anschließend in eine Datei gespeichert. Dabei arbeitet XmlDocument als ObjectFactory: Sie erzeugt alle anderen Nodes, die der jeweilige Parentnode dann via AppendChild als Childnode einfügt.

Das folgende einfache Beispiel verdeutlicht das Prinzip. "dom" ist eine Instanz der Klasse System.Xml.XmlDocument; mit CreateElement('Root') wird zunächst das Objekt "e" der Klasse System.Xml.XmlElement generiert. Durch "dom.AppendChild(e)" fügt das XMLDocument dieses "e" als Childnode ein, dieses ist dann das Root-Element, das nur einmal vorkommen darf. Ein zweiter Aufruf von "dom.AppendChild" würde fehlschlagen.


 System.Xml.XmlDocument dom;
 System.Xml.XmlElement e, ei; 
 System.Xml.XmlText tn;
 dom = new System.Xml.XmlDocument();
 e = dom.CreateElement("Root");
 dom.AppendChild(e);
 for (int i=1; i<10; i++)
 {
     ei = dom.CreateElement("Zahl");
     tn = dom.CreateTextNode(i.ToString());
     ei.AppendChild(tn);
     e.AppendChild(ei);
 }
 dom.Save(@"C:\wg\myXMLDocument.xml");

Im nächsten Schritt wird eine Schleife von 1 bis 9 durchlaufen. Bei jedem Schritt wird via "dom" sowohl ein XmlElement "Zahl" ("ei") als auch ein XmlText ("tn") mit dem jeweiligen Zahlenwert generiert. "ei" fügt "tn" als Childnode hinzu, und das Root-Element "e" fügt seinerseits "ei" als Childnode hinzu.

Im letzten Schritt wird der so im Arbeitsspeicher generierte XML-Baum in einer Datei abgespeichert, das Ergebnis sieht so aus:


<Root>
  <Zahl>1</Zahl>
  <Zahl>2</Zahl>
  <Zahl>3</Zahl>
  <Zahl>4</Zahl>
  <Zahl>5</Zahl>
  <Zahl>6</Zahl>
  <Zahl>7</Zahl>
  <Zahl>8</Zahl>
  <Zahl>9</Zahl>
</Root>

Ich baue dieses Beispiel noch etwas aus, um zu verdeutlichen, wie leicht das XmlDocument im Arbeitsspeicher verändert werden kann. Nachdem Sie den ursprünglichen XML-Baum erzeugt haben, fügen Sie jedem "Zahl"-Element ("ei") noch zwei Attribute, einen sowie eine CDATA-Section hinzu. Der urspüngliche Childnode wird gelöscht.

Vorweg baue ich noch eine XmlDeclaration (für und ) sowie eine ein.


 System.Xml.XmlDocument dom;
 System.Xml.XmlElement e, ei;
 System.Xml.XmlText tn;
 System.Xml.XmlComment c;
 System.Xml.XmlProcessingInstruction pi;
 System.Xml.XmlDeclaration decl;
 System.Xml.XmlCDataSection ds;
 dom = new System.Xml.XmlDocument();
 decl = dom.CreateXmlDeclaration("1.0", 
                  "iso-8859-1", "yes");
 e = dom.CreateElement("Root");
 pi = dom.CreateProcessingInstruction("TARGET", 
                                      "DATA");
 dom.AppendChild(decl);
 dom.AppendChild(pi);
 dom.AppendChild(e);
 //erstelle den urspruenglichen Baum
 for (int i=1; i<10; i++)
 {
     ei = dom.CreateElement("Zahl");
     tn = dom.CreateTextNode(i.ToString());
     ei.AppendChild(tn);
     e.AppendChild(ei);
 }
 for (int i = 1; i < 10; i++)
 {
     //nimm jeden Childnode von e, caste als XmlElement
     ei = (System.Xml.XmlElement) e.ChildNodes[i-1];
     // fuege ein Attribut Wert hinzu
     ei.SetAttribute("Wert", i.ToString());
     int ii = i * i;
     // zweites Attribut Quadrat
     ei.SetAttribute("Quadrat", ii.ToString());
     //der erste Childnode wird entfernt
     ei.RemoveChild(ei.ChildNodes[0]);  
     // fuege einen Kommentarknoten ein   
     c = dom.CreateComment("removed childnode");
     ei.AppendChild(c);
     //fuege eine CDATA-Section ein
     ds = dom.CreateCDataSection((ii*i).ToString());
     ei.AppendChild(ds);
 } 
 dom.Save(@"C:\wg\myXMLDocument.xml");

Das Ergebnis wird kaum überraschen:


<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<?TARGET DATA?>
<Root>
  <Zahl Wert="1" Quadrat="1">
    <!--removed childnode--><![CDATA[1]]></Zahl>
  <Zahl Wert="2" Quadrat="4">
    <!--removed childnode--><![CDATA[8]]></Zahl>
  <Zahl Wert="3" Quadrat="9">
    <!--removed childnode--><![CDATA[27]]></Zahl>
  <Zahl Wert="4" Quadrat="16">
    <!--removed childnode--><![CDATA[64]]></Zahl>
  <Zahl Wert="5" Quadrat="25">
    <!--removed childnode--><![CDATA[125]]></Zahl>
  <Zahl Wert="6" Quadrat="36">
    <!--removed childnode--><![CDATA[216]]></Zahl>
  <Zahl Wert="7" Quadrat="49">
    <!--removed childnode--><![CDATA[343]]></Zahl>
  <Zahl Wert="8" Quadrat="64">
    <!--removed childnode--><![CDATA[512]]></Zahl>
  <Zahl Wert="9" Quadrat="81">
    <!--removed childnode--><![CDATA[729]]></Zahl>
</Root>

wg / 12. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/generiereXML.html