Xml auslesen

JaD

Mitglied
Hallo,
ich habe folgendes Problem.
Ich habe eine Xml-Datei, aus der ich im Prinzip ein Attribut auslesen und überprüfen muss.
Bis jetzt öffne ich die Datei und speicher den Inhalt:
Code:
   //Variablen Deklaration 
   fstream datei;
   char buff[255]="";
   int gelesen = 0;
   string vergleich = "test";

   //Test Datei öffnen
   datei.open("C:\\Dokumente und Einstellungen\\test.xml", ios::in);

   if(!datei.is_open())
   {
   	cout<<"Fehler beim Öffnen der Datei"<<endl;

   }
   while (!datei.eof())
   {
	datei.read(buff, sizeof(buff)-1);
	gelesen = datei.gcount();

	if(strcmp(buff, vergleich.c_str())==0)
	{
	   cout<<"Klappt"<<endl;
	   
	}
	else
	{ 
 	   cout.write(buff, gelesen);
   	   cout<<"klappt nicht"<<endl;
	}
	
   }
   cout<<endl;
Aber leider klappt das mit dem Überprüfen nicht und ich weiß auch nicht so richtig, wie ich da vorgehen soll.
Wäre super, wenn mir jemand helfen könnte.
Gruß JaD
 
Hi.
Code:
   while (!datei.eof())
Die eof() Methode solltest du nicht verwenden. Siehe z.B. http://www.tutorials.de/forum/1376694-post8.html
Code:
   {
	datei.read(buff, sizeof(buff)-1);
Hier solltest du prüfen, ob das Einlesen überhaupt erfolgreich war bevor du weitermachst.
Code:
	gelesen = datei.gcount();

	if(strcmp(buff, vergleich.c_str())==0)
Warum so kompliziert? Den std::string kannst du direkt mit dem == Operator mit dem C-String vergleichen.
Aber leider klappt das mit dem Überprüfen nicht und ich weiß auch nicht so richtig, wie ich da vorgehen soll.
Was steht denn in der Datei drin? \edit: Die Methode terminiert die Zeichenkette nicht mit einem \0 Zeichen, das mußt du noch machen, bevor du mit Stringoperationen auf buff zugreifen kannst.

Dann solltest du zur Verarbeitung von XML besser eine fertige Bibliothek (tinyxml z.B.) verwenden. :suchen:

Gruß
 
Zuletzt bearbeitet:
Ok, danke auch für den Hinweis bzgl. der eof-methode...
Wolltes es jetzt mit msxml probieren und hab mir nen Tutorial gesucht.
Bis jetzt probiere ich die Xml-Datei zu laden.

Code:
variant_t vResult;
	void *output = NULL;
	MSXML2::IXMLDOMDocumentPtr
		pXml(MSXML2::CLSID_DOMDocument);
	IStream *pOutStream;

	try
	{
		vResult = pXml->load(_bstr_t("C:\\Dokumente und Einstellungen\\test.xml"));
	}
	catch (_com_error &e)
	{
		AfxMessageBox("Error");
		exit(-1);
	}

Das wird auch ohne Fehler kompiliert.....Aber es öffnet sich jedes mal ein Microsoft Visual C++ Debug Libary Fenster, dass mir sagt "Debug Assertion Failed" ?
Wieso? ^^
 
Zuletzt bearbeitet:
Hi.

Was verwendest du denn überhaupt für einen Compiler?

Warum hast du dich denn für MSXML entschieden? Es ist so schon nicht schlecht, aber ich habe es vor Jahren mal probiert und es war schon etwas schwierig in C++ zu verwenden...

Gruß
 
Hi,
arbeite mit Visual Studio 2005.
Hauptsächliche, weil ich es ja eh schon hab...^^
Und weil ich ja im Prinzip nicht so viel machen muss, will ja nur einmal die Datei durchlaufen und einen Wert überprüfen....
 
Ok, der Fehler kommt schon mal nicht mehr.
Probiere dann mal, die Datei auf den einen Wert zu überprüfen.
Vielen Danke schon mal für die Hilfe.:)
 
Also, ich habe mich jetzt mal ein bißchen damit beschäftigt und habe bisher das:

Code:
IXMLDOMDocumentPtr m_plDomDocument;
IXMLDOMElementPtr m_pDocRoot;

Und in der OnInitDialog-Funktion:
Code:
// Initialisierung DOM
	::CoInitialize(NULL);

	HRESULT hr = m_plDocument.CreateInstance(CLSID_DOMDocument);
	if(FAILED(hr))
	{
		_com_error er(hr);
		AfxMessageBox(er.ErrorMessage());
		EndDialog(1);

	}
	//XML-Datei Name
	CString strFileName ("C:\\Dokumente und Einstellungen\\test.xml");
	
	//CString in BSTR
	_bstr_t bstrFileName;
	bstrFileName = strFileName.AllocSysString();

	//Laden des Dokuments
	variant_t vResult;
	vResult = m_plDocument->load(bstrFileName);
	if (((bool)vResult) == TRUE)
	{
		m_pDocRoot = m_plDocument->documentElement;
		AfxMessageBox("Erfolgreich geladen");
	}
	else
	{
		AfxMessageBox("Laden fehlgeschlagen");
	}
	AfxMessageBox(m_plDocument->xml);

Und hier dann die eigentlichen Funktionen:

Code:
void CXMLTestDlg::OnBnClickedOk()
{
	DisplayChildren(m_pDocRoot);
}

void CXMLTestDlg::DisplayChildren(MSXML2::IXMLDOMNodePtr pParent)
{
	DisplayChild(pParent);

	for (MSXML2::IXMLDOMNodePtr  pChild= pParent->firstChild;
		NULL != pChild;
		pChild = pChild->nextSibling)
	{
		DisplayChildren(pChild);
	}
	
}

void CXMLTestDlg::DisplayChild(MSXML2::IXMLDOMNodePtr pChild)
{
	if (MSXML2::NODE_TEXT == pChild->nodeType)
	{
		AfxMessageBox(pChild->text);
	}
	else
	{
		AfxMessageBox(pChild->nodeName);
	}
}

Das funktioniert auch alles wunderbar und er lädt die Datei und liest sie aus.
Mein Problem ist jetzt, dass ich nur an ein Attribut ran muss, aber da leider nicht weiter komme. Wäre super, wenn da jemand nen Tipp hätte.

Gruß JaD
 
Zuletzt bearbeitet:
Zurück