Parsen von XML-Dokument mit DOM in VC + +


eXtensible Markup Language (XML) ist die Industrie-Standard für den Austausch von Informationen. XML erlaubt es Benutzern, ihre eigenen Tags. Diese Tags werden dann verwendet, um die Daten. Zum Beispiel, <author> Syed Feroz Zainvi </ author>.
Ein XML-Dokument ist hierarchisch aufgebaut. An der Spitze gibt es eine DocumentRoot, gefolgt von anderen Knoten, die wiederum weitere Knoten. Es kann die Eigenschaften und die Daten im Zusammenhang mit diesen Knoten.
XML-Parser sind Instrumente, die zu lesen oder zu schreiben, um ein XML-Dokument. Die Parser sind, die entweder auf DOM (Document Object Model) und SAX (Simple API for XML)-Standards. Ein Vergleich von DOM und SAX Ansätze ist in vielen Büchern und auf Websites auch.
In diesem Artikel erfahren Sie, wie zu lesen und Extraktion von Informationen aus einem XML-Dokument in VC + +-Anwendung. Es wird davon ausgegangen, dass Sie über grundlegende Erfahrungen mit der Verwendung von Microsoft Visual Studio 6.0 (MSIDE) für die Erstellung von VC + +-Anwendungen.
- Download neuesten MSXML SDK aus http://www.microsoft.com/. Doppelklicken Sie auf das Installationsprogramm die Installation des SDK heruntergeladen. Die Installation wird ein Ordner mit MSXML in Ihrem SET PATH wie C: oder unter C: \ Program Files. Dieser Ordner enthält Unterordner anlegen und inkl. lib, die Bibliotheken und Header-Dateien, die für die Anwendungsentwicklung. Auch msxmlX.dll, msxmlXr.dll - wobei X-Version (wird spätestens 6) - kopiert werden: C: \ Windows \ System32-Verzeichnis.
- Erstellen Sie ein neues Projekt mit MSIDE. Es kann von jeder Art - MFC-Anwendungs-, Win32-Konsole app, etc.
- Weiter erstellen Sie eine Header-Datei und eine Datei, die Sie den Code der XML-Parsing.
- Fügen Sie MSXML Header und Bibliotheken entweder manuell oder automatisch. Manuell kann dies durch das Hinzufügen Installationspfad und Bibliotheken unter jeweiligen Registerkarten im Dialogfeld öffnet, dass durch die Projekt-Einstellungen-Menü von MSIDE. Es ist besser, dies zu tun automatisch nur durch das Hinzufügen der folgenden zwei Zeilen Code in Ihre Header-Datei. # Import <msxml6.dll> named_guids
using namespace MSXML2; - Auch in Ihrer Header-Datei die folgenden Erklärungen: IXMLDOMDocumentPtr m_plDomDocument;
IXMLDOMElementPtr m_pDocRoot;void DisplayChildren (IXMLDOMNodePtr pParent);
void DisplayChild (IXMLDOMNodePtr pChild);
void DisplayAttributes (IXMLDOMNodePtr pChild, string Elternteil, String & apname);
void InitialiseXMLCOM (CString fomFileName);bool geladen;
- Und da Zeichenfolge verwendet wird, fügen Sie folgende Zeilen zu Ihrer Header-Datei: # include "string"
using namespace std; - Nach diesen Projekt-Einstellungen, müssen Sie Code schreiben für das Laden eines XML-Dokuments. Microsoft COM (Component Object Model)-Modul verwendet wird. Obwohl mir Kommentare, bevor Sie KOM-Funktion, können interessierte Leser KOM Dokumentation anderswo. Geladen = true;
/ / Initialisieren für COM-Modul
:: CoInitialize (NULL);/ / Erzeuge eine Instanz von XML-Dokument
HRESULT hr = m_plDomDocument.CreateInstance (L "Msxml2.DOMDocument.6.0");/ / check eine Instanz konnte nicht erstellt werden und die Fehler vor dem Abbruch
if (FAILED (hr))
(
_com_error ER (hr);
AfxMessageBox (er.ErrorMessage ());
EndDialog (1);
)/ / Xml-Datei konvertieren Name String, der etwas kann KOM (BSTR)
_bstr_t bstrFileName;
bstrFileName = strFileName.AllocSysString ();/ / Aufruf der Funktion IXMLDOMDocumentPtr die Belastung, um die XML-Dokument
variant_t vResult;
vResult = m_plDomDocument-> load (bstrFileName);/ / wenn erfolgreich geladen, dann Root-Element des Dokuments
if (((bool) vResult) == true) / / Erfolg!
(
/ / Von nun an, dass das Dokument geladen ist, müssen wir die Initialisierung des Root-Zeiger
m_pDocRoot = m_plDomDocument-> documentElement;/ / Folgende Funktion rekursiv Traverse der XML-Baum für Kinder, Geschwister und Knoten
DisplayChildren (m_pDocRoot);
)
sonst
(
AfxMessageBox ( "Dokument konnte nicht geladen werden!");
) - Nun, seine Zeit zu durchqueren den Baum im XML-Dokument. Folgende Funktionen machen diese rekursiv.
void DisplayChildren (IXMLDOMNodePtr pParent)
(
/ / Anzeige des aktuellen Knotens Name
DisplayChild (pParent);/ / Einfache for-Schleife, um alle Kinder
for (IXMLDOMNodePtr pChild = pParent-> firstChild;
NULL! = PChild;
pChild = pChild-> nextSibling)
(
/ / Für jedes Kind, rufen Sie diese Funktion, so dass wir
/ / Ihre Kinder als auch
DisplayChildren (pChild);
)
)void DisplayChild (IXMLDOMNodePtr pChild)
(
IXMLDOMElementPtr pElem1, pElem2;
String CIDs, apname;/ / prüfen, ob ein Kind seine Knoten. Zweite Voraussetzung zeigt, wie können Sie Name des Knotens
if (NODE_ELEMENT == pChild-> nodeType & & (pChild-> nodeName) == _bstr_t ( "somename"))
(
HRESULT hr1 = pChild-> QueryInterface (MSXML2:: IID_IXMLDOMElement, (void **) & pElem1);
if (FAILED (HR1)) (_com_raise_error (HR1);)CIDs = static_cast <string> ((_bstr_t) (pElem1-> getAttribute (_T ( "name "))));
/ / Process all ihre Geschwister rekursiv und extrahieren ihre Attribute
for (IXMLDOMNodePtr pChild1 = pChild-> firstChild;
NULL! = PChild1;
pChild1 = pChild1-> nextSibling)
(
DisplayAttributes (pChild1, CIDs, apname);)
)
)
- Für jeden Knoten, extrahieren die Attribute. Folgende Funktion verwendet fordert gleiche Funktion wie die oben genannten. DisplayAttributes void (IXMLDOMNodePtr pChild, cid string, string & CIDs)
(
IXMLDOMElementPtr pElem;if (NODE_ELEMENT == pChild-> nodeType & & (pChild-> nodeName == _bstr_t ( "somename1") | | pChild-> nodeName == _bstr_t ( "Attribut")))
(
HRESULT hr1 = pChild-> QueryInterface (MSXML2:: IID_IXMLDOMElement, (void **) & pElem);
if (FAILED (HR1)) (_com_raise_error (HR1);)CIDs = static_cast <string> ((_bstr_t) (pElem-> getAttribute (_T ( "name "))));
)
andere (/ / verschiedene Bedingungen wie andere Knotennamen
(
)
) - Interessierte Nutzer können die Schaffung von DOM dynamisch, Abfrage von XML-Dokument mit XPath, Bearbeiten und Speichern von XML-Dokument zu.

Delicious
Digg
Google
Yahoo