XMLDocument lesefehler

Christian Kusmanow

Erfahrenes Mitglied
Hallo FIAE's!

Ich bin gerade dabei ein ErrorLog in mein Prog einzubauen. Nachdem ich es eingelesen habe wollte ich es erweitern.
Mein XML Document lässt sich aber nicht einlesen.
Ich habe schon die Hilfe durchforstet komme aber nicht weiter.

HTML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Error_Messages>
	<MessageNr1_Test_ExMessage>
		<Exception_Message>Test_ExMessage</Exception_Message>
		<Exception_Details>System.Exception: Test_ExMessage     at [...] .cs:line 3385</Exception_Details>
	</MessageNr1_Test_ExMessage>
</Error_Messages>
Die Datei lade ich mit
Code:
Document.LoadXml( AppPath+sErrorLogFile );
Es wird immer der Fehler:
"The data at the root level is invalid. Line 1, position 1."
angezeigt.

Was mache ich falsch? Fehlen angaben in der XML Datei?

MFG cosmo
 
Das Xml scheint keinen Fehler zu haben. Ich kanns ohne Troubles laden ..

Mein Code hierzu:

Code:
XmlDocument doc = new XmlDocument();
doc.Load(@"MeinPfad\test.xml");

XmlNode sn = doc.SelectSingleNode("Error_Messages/MessageNr1_Test_ExMessage/Exception_Message");
			Console.WriteLine(sn.InnerText.ToString());
 
Danke für die schnelle Antwort!

Ich bekomm aber immer noch den gleichen fehler auch wenn ich den XML-Head weglasse.
"The data at the root level is invalid. Line 1, position 1."
Ich habe mir das Exception Objekt mal ganauer angeschauet und das hier noch gefunden:
[ErrorCode "Xml_InvalidRootData"]

Ich verstehe leider immer noch nicht warum das jetzt abschmiert. Hast Du noch eine Idee?
Hab ich irgend eine Namenskonvention nicht eingehalten?

Gruss cosmo
 
Kann es sein, dass du mehr als _ein_ Root-Element hast? Wenn ja, dann ists klar. Du darfst nämlich nur ein einziges Root-Element verwenden und alle anderen Nodes müssen darunter liegen.
 
Es ist haar genau die gleiche XML Datei wie oben.

Habe es jetzt anders gelöst:
Code:
Reader = new XmlTextReader( AppPath+sErrorLogFile );
Document.Load( Reader );
Reader.Close();
ExceptionElement = Document.DocumentElement;
Danach konnte ich mein XML ganz einfach erweitern und es sieht jetzt so aus:
HTML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Error_Messages>
	<MessageNr1_Test_ExMessage>
		<Exception_Message>Test_ExMessage</Exception_Message>
		<Exception_Details>System.Exception: Test_ExMessage     [...].cs:line 3385</Exception_Details>
	</MessageNr1_Test_ExMessage>
	<MessageNr2_Test_ExMessage>
		<Exception_Message>Test_ExMessage</Exception_Message>
		<Exception_Details>System.Exception: Test_ExMessage     [...].cs:line 3385</Exception_Details>
	</MessageNr2_Test_ExMessage>
</Error_Messages>
Im iExplorer wird das XML auch korrekt dargestellt.
Wenn ich jetzt wieder versuche das XML mit
Code:
Document.LoadXml( AppPath+sErrorLogFile );
zu öffnen schmiert es wieder ab.

Warum bin ich der einzige bei dem das nicht so einfach klappt?
Was mach ich nur falsch?
 
Ohh, Du hast vollkommen recht!
Ich hätte
Code:
Document.Load( AppPath+sErrorLogFile );
verwenden sollen.
Hab mich böse vertan. :suspekt:

Ich danke Dir! Und das passiert mir nicht nochmal. Ist schon das zweite mal wenn Du dich noch erinnern kannst( String.Replace ). :p
Werd in Zukunft den Objektbrowser öfter ausgiebig kunsultieren.

Gruss cosmo
 
Der Thread ist zwar schon etwas älter, aber ichhätte dazu noch an cosmochaosmaker ne Frage.

Wie schaut dein Codeteil aus, wo du an das eingelesene XmlDocument noch Elemente dranhängst und wieder abspeicherst?

Ich bekomme immer den Fehler:

Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.xml.dll aufgetreten.

Zusätzliche Informationen: Das Dokument hat bereits einen DocumentElement-Knoten.


Mein Code schaut folgendermaßen aus:
Code:
XmlTextReader reader = new XmlTextReader( "InputFileName.xml" );
reader.WhitespaceHandling = WhitespaceHandling.None;

XmlDocument document = new XmlDocument();
document.Load( reader );
reader.Close();

XmlNode newNode =
  document.CreateNode( XmlNodeType.Element, "TestElement", "" );

// Bei nachfolgender Zeile kommt der Fehler
document.InsertAfter( newNode, document.DocumentElement );

document.Save( "OutputFileName.xml" );

mfG,
MAN
 
Hi!

Du musst Dir das DocumentElement erstmal holen. Dann kannst Du beliebig viele Nodes anfügen.
Code:
try { 
	Document = new XmlDocument();

	if ( File.Exists( Path )){
		Document.Load( Path );
		ExceptionElement = Document.DocumentElement;
	}
	else
		ExceptionElement = Document.CreateElement( "Error_Messages" );
				
	if ( Document.HasChildNodes )
		count += ExceptionElement.ChildNodes.Count;

	ExLogElement = Document.CreateElement( "Exception" );
		ExLogElement.SetAttribute( "Count", DateTime.Now.ToShortDateString() );
		ExLogElement.SetAttribute( "ExType", DateTime.Now.ToShortDateString() );
		ExLogElement.SetAttribute( "Date", DateTime.Now.ToShortDateString() );
					
	DetailsElement = Document.CreateElement( "Exception" );
	DetailsElement.InnerText = ExString;

	ExLogElement.AppendChild( DetailsElement );		
	ExceptionElement.AppendChild( ExLogElement );
	Document.AppendChild( ExceptionElement );
				
	if ( !File.Exists( Path )){
		writer = new XmlTextWriter( Path, System.Text.Encoding.UTF8 );
		writer.Formatting = Formatting.Indented;
		writer.WriteStartDocument(true);
		Document.Save( writer );
	}
	else
		Document.Save( Path );
	}
	catch ( Exception ) {
		Class_ErrorMessages.Show_ErrorLogException( sErrorLogFile );
	}
	finally {
		if (writer != null){
			writer.Close();
	}
}

MfG cosmo
 
Zuletzt bearbeitet:
Ich hatte die Frage vorher falsch formuliert. Da hab ich nicht gesagt, dass ich einem vorhandenen Dokument ein neues übergeordnetes Root-Element geben will.

Das heißt, wie bekomme ich aus folgender Struktur, die Struktur darunter?

Aus dem:
Code:
<rootElement>
   <testElement></testElement>
</rootElement>

soll das werden:
Code:
<newRootElement>
   <rootElement>
      <testElement></testElement>
   </rootElement>
</newRootElement>

mfG,
MAN
 

Neue Beiträge

Zurück