2009-11-02 5 views
16

Ich stieß gerade auf ein Problem mit XmlDocument.LoadXml.XmlDocument.Load Vs XmlDocument.LoadXml

Die Anwendung wurde abstürzt, wird folgende Fehler geben:

"Data at the root level is invalid. Line 1, position 1"

Nachdem die XML-Inspektion und nichts falsch mit ihm zu finden, gegoogelt ich ein bisschen und eine Spitze gefunden XmlDocument.Load statt XmlDocument.LoadXml zu verwenden.

Ich habe es ausprobiert und es funktioniert perfekt.

Meine Frage ist: Was ist der Unterschied zwischen den 2 Methoden und was hätte dazu führen können, dass einer arbeitet und der andere fehlschlägt?

Antwort

32

XmlDocument.Load wird verwendet, um XML entweder aus einem Stream, TextReader, Pfad/URL oder XmlReader zu laden. XmlDocument.LoadXml wird verwendet, um das in einer Zeichenfolge enthaltene XML zu laden.

Sie sind grundsätzlich unterschiedliche Wege zum Laden von XML, abhängig davon, wo die XML tatsächlich gespeichert ist. Es klingt also so, als hätten Sie die falsche Methode für Ihre XML verwendet.

20

Haben Sie versucht, XmlDocument.LoadXml zu verwenden und den Namen einer Datei zu übergeben? Das geht nicht - es geht davon aus, dass die Zeichenfolge, die Sie in übergeben, XML ist. So könnten Sie verwenden:

doc.LoadXml("<root><child /><root>"); 

oder

doc.Load("myfile.xml"); 

Wenn das nicht hilft, können Sie zeigen Ihre Schwäche und Arbeits Code? Es gibt verschiedene Möglichkeiten, wie Sie verwenden, LoadXml-Load geändert haben könnten ...

+0

I doc.LoadXml Methode verwenden. Ich habe eine XML-Datei, die auch eine Dokumenttyp-Definitionsdatei enthält. Ich habe es die SoccerMatchPlus.dtd, wo die XML-Dateien vorhanden sind. Ich habe einen Fehler bei der Verwendung der doc.LoadXml-Methode, wie die Datei 'C: \ Windows \ system32 \ SoccerMatchPlus.dtd' nicht finden konnte. Warum findet die doc.LoadXml-Methode die Datei im Ordner "C: \ Windows \ system32"?Kann ich den Pfad zur Laufzeit ändern? –

+0

@Rais: Es klingt wie Sie möchten eine neue Frage zu starten ... –

+0

ok Ich poste meine Frage, ich denke, Sie haben Recht. Vielen Dank. –

2

Load() lädt von einer bestimmten Quelle, während LoadXml() lädt direkt aus einem String

3

Angenommen, Ihre Verwendung XmlDocument.Load und XmlDocument.LoadXml in der rechts Art und Weise dieses Problem kann durch Byte Order Mark verursacht werden.

Diese other question könnte nützlich sein.

+0

Ja, das. Ich entdeckte auf die harte Tour, dass ich vor dem Laden eines 'XmlDocument' kein' byte [] 'in eine' string' konvertieren sollte (auch wenn ich die Kodierung kenne). Das war der genaue Grund - ich bekam BOM'd. Ich habe stattdessen 'byte []' in einen 'MemoryStream' geladen, und alles ist gut. –

0

Die Anwendung wurde mit dem folgenden Fehler abstürzt: „Daten auf der Stammebene ist ungültig Zeile 1, Position 1.“ Ich vermute, Sie XML-Daten keine Root-Ebene haben: zum Beispiel:

<area id="1"> 
    <candidate id="0">dataata</candidate> 
</area> 
<area id="2"> 
    <candidate id="0">dataataa</candidate> 
</area> 

Sie müssen mindestens eine Root-Ebene über den unteren Ebenen haben. zum Beispiel:

<areas> 
    <area id="1"> 
    <candidate id="0">dataata</candidate> 
    </area> 
    <area id="2"> 
    <candidate id="0">dataataa</candidate> 
    </area> 
</areas> 

so bitte eine Mutter auf der Oberseite Ihrer Ebene setzen, macht es grand Mutter aller Kinder

+0

Zeile 1, Position 1 ist der Anfang des Dokuments. Es hat noch nicht begonnen, nach struktureller Validität und einem Element auf Doc-Ebene zu suchen. –

Verwandte Themen