{"id":55000237,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T14:21:53","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=237"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"XML_lesen_mit_dem_Document_Object_Model","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/XML_lesen_mit_dem_Document_Object_Model\/","title":{"rendered":"XML lesen mit dem Document Object Model"},"content":{"rendered":"<p><b>Mit der Klasse XmlReader, die wir im Artikel &#8220;XML-Dokumente schnell lesen mit XmlReader&#8221; vorgestellt haben, k&ouml;nnen Sie XML-Dokumente schnell sequenziell durchlaufen. Dies eignet sich vor allem f&uuml;r den Zugriff auf sehr gro&szlig;e XML-Dokumente. Wenn Sie selektiver auf die Inhalte des XML-Dokuments zugreifen wollen, k&ouml;nnen Sie das Document Object Model nutzen. Implementierungen dieser Schnittstelle, die kurz DOM genannt wird, gibt es f&uuml;r fast alle Programmiersprachen &#8211; so auch f&uuml;r die von .NET. Dieser Artikel zeigt, wie Sie die Klassen, Eigenschaften und Methoden des Document Object Models f&uuml;r den Zugriff auf XML-Dokumente nutzen.<\/b><\/p>\n<p><b>DOM im Gegensatz zu XmlReader und XmlWriter<\/b><\/p>\n<p>Einer der wichtigsten Unterschiede des Document Object Model im Vergleich zur <b>XmlReader<\/b>-Klasse ist, dass Sie damit nicht nur lesend, sondern auch schreibend auf die XML-Dokumente zugreifen k&ouml;nnen. Das hei&szlig;t, wenn Sie ein Element gefunden haben, dessen Inhalt Sie &auml;ndern m&ouml;chten, dann k&ouml;nnen Sie das direkt mit den Methoden des Document Object Models erledigen. Sie k&ouml;nnen damit nicht nur Elemente bearbeiten, sondern auch neue Elemente hinzuf&uuml;gen oder bestehende Elemente l&ouml;schen. Und nat&uuml;rlich k&ouml;nnen Sie damit auch komplett neue XML-Dokumente erstellen und mit Daten f&uuml;llen. Dazu steht allerdings auch die Klasse <b>XmlWriter<\/b> zur Verf&uuml;gung, die wir im Artikel <b>XML-Dokumente erstellen mit XmlWriter<\/b> vorgestellt haben.<\/p>\n<p>Mit dem Document Object Model laden Sie das komplette XML-Dokument in den Speicher, weshalb einzelne Elemente gezielt angesteuert werden k&ouml;nnen. W&auml;hrend beim XmlReader f&uuml;r alle Elemente die gleichen Eigenschaften abgefragt werden k&ouml;nnen und je nach Elementtyp mal die eine, mal die andere Eigenschaft Werte zur&uuml;ckliefert, liest das Document Object Model die einzelnen Elemente des XML-Dokuments mit einem entsprechenden Objekttyp ein. <\/p>\n<p><b>XML-Baum<\/b><\/p>\n<p>Intern bildet DOM das XML-Dokument als Baumstruktur ab. Das kann man sich so vorstellen, dass wir ein Stammelement haben, das an der Spitze sitzt. Darunter gibt es dann ein oder mehrere untergeordnete Elemente, die wiederum untergeordnete Elemente haben, bis dann irgendwann Werte in den Elementen stehen &#8211; diese landen immer am anderen Ende des Baums. Einen Baum f&uuml;r unser Beispiel-XML-Dokument finden Sie in Bild 1.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_237_001.png\" alt=\"Baum eines XML-Dokuments\" width=\"499,6607\" height=\"758,0825\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Baum eines XML-Dokuments<\/span><\/b><\/p>\n<p>Dieser bildet die aus Platzgr&uuml;nden gek&uuml;rzte Version des XML-Dokuments aus Bild 2 ab.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_237_002.png\" alt=\"Ausschnitt des Dokuments entsprechend dem Baum aus der ersten Abbildung\" width=\"549,6265\" height=\"580,059\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausschnitt des Dokuments entsprechend dem Baum aus der ersten Abbildung<\/span><\/b><\/p>\n<p><b>Verweis auf den Namespace System.Xml<\/b><\/p>\n<p>Bevor wir ein Objekt auf Basis der Klasse <b>XmlDocument <\/b>nutzen k&ouml;nnen, m&uuml;ssen wir einen Verweis auf den folgenden Namespace zur Klasse hinzuf&uuml;gen:<\/p>\n<pre>Imports System.Xml<\/pre>\n<p><b>Deklarieren und Initialisieren von XmlDocument<\/b><\/p>\n<p>Mit den folgenden beiden Anweisungen deklarieren und initialisieren wir ein Objekt namens <b>objXML <\/b>mit dem Typ <b>XmlDocument<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>XmlDocument\r\nobjXML = <span style=\"color:blue;\">New<\/span> XmlDocument<\/pre>\n<p><b>Laden des XML-Dokuments<\/b><\/p>\n<p>F&uuml;r das Laden eines XML-Dokuments bietet die <b>XmlDocument<\/b>-Klasse zwei Methoden an:<\/p>\n<ul>\n<li><b>Load<\/b>: Erwartet den Pfad des zu ladenden XML-Dokuments als Parameter, falls es sich um eine Datei handelt. Sie k&ouml;nnen auch eine URL angeben. &Uuml;berladungen erlauben auch das Laden aus einem <b>Stream<\/b>-, einem <b>TextReader<\/b>&#8211; oder einem <b>XmlReader<\/b>-Objekt.<\/li>\n<li><b>LoadXml<\/b>: Erwartet das XML-Dokument als String-Parameter.<\/li>\n<\/ul>\n<p>Die folgenden Anweisungen erzeugen ein <b>XmlDocument<\/b>-Objekt, laden das Dokument <b>Bestellverwaltung.xml <\/b>hinein und geben den Inhalt &uuml;ber die Eigenschaft <b>OuterXml <\/b>aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objXML<span style=\"color:blue;\"> As <\/span>XmlDocument\r\nobjXML = <span style=\"color:blue;\">New<\/span> XmlDocument\r\nobjXML.Load(\"C:\\...\\Bestellverwaltung.xml\")\r\n<span style=\"color:blue;\">Debug.Print<\/span>(objXML.OuterXml)<\/pre>\n<p>Die Ausgabe mit <b>InnerXml <\/b>liefert f&uuml;r das <b>XmlDocument <\/b>selbst &uuml;brigens das gleiche Ergebnis wie <b>OuterXml<\/b>. <\/p>\n<p><b>Fehler beim Einlesen abfangen<\/b><\/p>\n<p>Im Gegensatz zur <b>Load<\/b>-Methode von DOM unter VBA, die einen <b>Boolean<\/b>-Wert zur&uuml;ckliefert, falls beim Einlesen ein Fehler auftritt, hat die <b>Load<\/b>-Methode unter VB.NET keinen R&uuml;ckgabewert. Wenn ein nicht g&uuml;ltiges XML-Dokument geladen wird, k&ouml;st die Methode schlicht und einfach einen Fehler aus. Diesen k&ouml;nnen wir jedoch per <b>Try&#8230;Catch <\/b>wie folgt abfangen:<\/p>\n<pre>Try\r\n     objXML.Load(\"C:\\...\\Bestellverwaltung.xml\")\r\nCatch ex<span style=\"color:blue;\"> As <\/span>XmlException\r\n     MessageBox.Show(\"Fehler beim Einlesen:\" + vbNewLine + vbNewLine + ex.Message)\r\nEnd Try<\/pre>\n<p>Sie k&ouml;nnen einen solchen Fehler leicht ausl&ouml;sen, indem Sie einen der Start- oder Endtags aus der Beispieldatei <b>Bestellverwaltung.xml <\/b>entfernen und dann versuchen, diese einzulesen.<\/p>\n<p><b>Klassen f&uuml;r die Untersuchung von XML-Dokumenten mit DOM<\/b><\/p>\n<p>Die Basisklasse f&uuml;r die Arbeit mit XML-Dokumenten hei&szlig;t <b>XmlNode<\/b>. Es gibt einige abgeleitete Klassen, zu denen auch <b>XmlDocument <\/b>geh&ouml;rt. Das hei&szlig;t, das <b>XmlNode <\/b>die grundlegenden Methoden und Eigenschaften bereitstellt und die abgeleiteten Klassen je nach Klasse weitere Elemente. <b>XmlDocument <\/b>bietet beispielsweise die bereits beschriebenen Methoden <b>Load <\/b>und <b>LoadXml <\/b>an. Weitere von <b>XmlNode <\/b>abgeleitete Klassen sind <b>XmlLinkedNode <\/b>und <b>XmlAttribute<\/b>. Von <b>XmlLinkedNode <\/b>sind weiterhin beispielsweise <b>XmlProcessingInstruction<\/b>, <b>XmlDeclaration <\/b>oder <b>XmlElement <\/b>abgeleitet &#8211; sowie die Klasse <b>XmlCharacterData<\/b>, die wiederum die Basis f&uuml;r Klassen wie <b>XmlComment <\/b>oder <b>XmlCDATASection <\/b>bildet.<\/p>\n<p>Das hei&szlig;t, dass Sie alle Elemente eines XML-Dokuments mit der Klasse <b>XmlNode <\/b>referenzieren k&ouml;nnen, aber wenn Sie die spezifischen Methoden und Eigenschaften nutzen wollen, finden Sie den genauen Typ heraus und nutzen diesen.<\/p>\n<p><b>Nodes durchlaufen mit der ChildNodes-Auflistung<\/b><\/p>\n<p>Mit <b>objXML <\/b>haben wir nun einen Verweis auf das <b>XmlDocument<\/b>-Objekt selbst. Wie kommen wir nun an die untergeordneten Elemente heran Daf&uuml;r bietet die <b>XmlNode<\/b>-Klasse und somit auch die <b>XmlDocument<\/b>-Klasse die Auflistung <b>ChildNodes <\/b>an. Wir k&ouml;nnen zun&auml;chst herausfinden, ob <b>XmlDocument <\/b>&uuml;berhaupt untergeordnete Elemente hat. Das erledigen wir mit der Eigenschaft <b>HasChildNodes<\/b>. Sind untergeordnete Elemente vorhanden, k&ouml;nnen wir &uuml;ber die <b>ChildNodes<\/b>-Auflistung auf diese zugreifen. Diese bietet mit der Eigenschaft <b>Count <\/b>die M&ouml;glichkeit, die Anzahl zu ermitteln. Im folgenden Beispiel geben wir die Werte von <b>HasChildNodes <\/b>und <b>ChildNodes.Count <\/b>aus und durchlaufen dann eine Schleife &uuml;ber alle <b>ChildNode<\/b>-Elemente. Diese referenzieren wir mit einer Variablen des Typs <b>XmlNode<\/b>. Das ist wichtig, weil sich in der Auflistung <b>ChildNodes <\/b>verschiedene Elemente mit von <b>XmlNode <\/b>abgeleiteten Klassen befinden. Wenn wir eine Variable des Typs <b>XmlElement <\/b>nutzen, erhalten wir einen Fehler, wenn eines der <b>ChildNode<\/b>-Elemente etwa den Typ <b>XmlDeclaration <\/b>hat.<\/p>\n<p>Wir k&ouml;nnen aber innerhalb der Schleife genau herausfinden, um welchen Typ es sich handelt. Dazu nutzen wir die Eigenschaft <b>NodeType<\/b>. Au&szlig;erdem geben wir mit folgenden Zeilen den Namen der untergeordneten Elemente aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objNode<span style=\"color:blue;\"> As <\/span>XmlNode\r\n<span style=\"color:blue;\">Debug.Print<\/span> (objXML.HasChildNodes)\r\n<span style=\"color:blue;\">Debug.Print<\/span> (objXML.ChildNodes.Count)\r\nFor Each objNode In objXML.ChildNodes\r\n     <span style=\"color:blue;\">Debug.Print<\/span> (objNode.Name + \" \" + objNode.NodeType.ToString)\r\n<span style=\"color:blue;\">Next<\/span> objNode<\/pre>\n<p>Das Ergebnis f&uuml;r dieses Beispiel lautet:<\/p>\n<pre>xml XmlDeclaration\r\nBestellverwaltung Element<\/pre>\n<p>Damit haben wir also die beiden Elemente der obersten Ebene erfasst, wobei das erste den Typ <b>XmlDeclaration <\/b>und das zweite den Typ <b>Element <\/b>hat:<\/p>\n<pre>&lt;xml version=\"1.0\" encoding=\"utf-8\"&gt;\r\n&lt;Bestellverwaltung&gt;<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000237\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000237?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000237\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"eb6809c847\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der Klasse XmlReader, die wir im Artikel &#8220;XML-Dokumente schnell lesen mit XmlReader&#8221; vorgestellt haben, k&ouml;nnen Sie XML-Dokumente schnell sequenziell durchlaufen. Dies eignet sich vor allem f&uuml;r den Zugriff auf sehr gro&szlig;e XML-Dokumente. Wenn Sie selektiver auf die Inhalte des XML-Dokuments zugreifen wollen, k&ouml;nnen Sie das Document Object Model nutzen. Implementierungen dieser Schnittstelle, die kurz DOM genannt wird, gibt es f&uuml;r fast alle Programmiersprachen &#8211; so auch f&uuml;r die von .NET. Dieser Artikel zeigt, wie Sie die Klassen, Eigenschaften und Methoden des Document Object Models f&uuml;r den Zugriff auf XML-Dokumente nutzen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66042020,44000027,44000012,44000028],"tags":[],"yst_prominent_words":[],"class_list":["post-55000237","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Excel_programmieren","category-Interaktiv","category-Word_programmieren"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000237"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000237\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000237"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}