2013-07-05 21 views
5

Ich arbeite mit ASP.NET und bin den Import einer XML-Datei aus einem Formular. Gerade jetzt konvertiere ich, dass in ein Stream:Lesen von XML-Stream von

Stream inputStream = XmlFileUploadControl.PostedFile.InputStream; 

, weil ich später diese Version benötigen.

Ich mag würde, um sicher zu stellen, überprüfen Sie, dass die XML-Datei das richtige Format hat, und, wenn ja, dann einige Informationen angezeigt werden:

if (CorrectFileFormat(inputStream)) 
{ 
    DisplayLicenseInfo(inputStream); 
} 

else 
{ 
    StatusLabel.Text = "Selected file is not a LicensingDiag XML file"; 
} 

Die CorrectFileFormat() Methode:

protected Boolean CorrectFileFormat(Stream inputStream) 
{ 

    XmlReader reader = XmlReader.Create(inputStream); 

    if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "DiagReport") 
    { 
     return true; 
    } 
} 

Die DisplayLicenseInfo() Methode:

protected void DisplayLicenseInfo(Stream inputStream) 
{ 

    XmlReader reader = XmlReader.Create(inputStream); 

    if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "LicensingStatus") 
    { 
     StatusLabel.Text += ("Licensing Status: " + reader.ReadString() + "<br><br>"); 
    } 

} 

aber ich bin Begegnung mit einer XmlException, die sagt "Daten auf der Stammebene ist ungültig. Zeile 1, Position 1 ". Ist dies, weil ich den Eingabestream bereits einmal gelesen habe und ihn zurücksetzen muss? Wenn ja, wie mache ich das?

+1

Was ist der Wert der Zeichenfolge? Es ist wahrscheinlich das nervtötende 'FEFF' ... –

Antwort

5

Das erste Mal erstellen Sie eine XmlReader um den Stream ist es an der Position 0. Aber das zweite Mal, erstellen Sie ein XmlReader, hat der Strom zum Teil bereits gelesen wurde, so dass er nicht mehr in der Position 0, so dass die XmlReader kann das XML-Dokument nicht lesen.

Stattdessen

using (XmlReader reader = XmlReader.Create(inputStream) 
{ 
    if (CorrectFileFormat(reader)) 
    { 
     DisplayLicenseInfo(reader); 
    } 
    else 
    { 
     StatusLabel.Text = "Selected file is not a LicensingDiag XML file"; 
    } 
} 

Wenn die Datei ist: Sie sollten die XmlReader nur einmal erstellen klein, können Sie auch prüfen, das gesamte XML-Dokument laden XmlDocument oder XDocument (Linq to XML) wird unter Verwendung von

+0

Danke, das habe ich mich gefragt. Gibt es keine Probleme beim Einlesen in ein 'XmlReader'-Objekt, wie es bei der ersten Methode der Fall wäre, oder würde die 2. Methode noch am Anfang beginnen? –

+0

Während dies definitiv in die richtige Richtung geht und mich auf die Display() -Methode bringt, macht es dann etwas mit der Anweisung, die ich in dieser Methode ausführe, wo es nicht mehr funktioniert. Irgendwelche Ideen? –

+0

@Adam_G, die zweite Methode, die denselben Reader verwendet, würde von der aktuellen Position aus fortgesetzt. Was deine zweite Frage betrifft, musst du präziser sein ... was meinst du mit "es tut etwas zur Aussage"? Und wie genau funktioniert es nicht mehr? –

4

@ thomas-levesque https://stackoverflow.com/users/98713/thomas-levesque wurden recht, wenn der Inhalt selbst wohlgeformt, dann müssen Sie den Strom zurückspulen zurück zu der Anfang des Inhalts.

Die CorrectFileFormat() -Methode:

protected Boolean CorrectFileFormat(Stream inputStream) 
{ 
    // rewind the stream back to the very beginning of the content 
    inputStream.Seek(0L, SeekOrigin.Begin); 
    XmlReader reader = XmlReader.Create(inputStream); 

    if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "DiagReport") 
    { 
     return true; 
    } 
} 

Die DisplayLicenseInfo() -Methode:

protected void DisplayLicenseInfo(Stream inputStream) 
{ 
    // rewind the stream back to the very beginning of the content 
    inputStream.Seek(0L, SeekOrigin.Begin); 
    XmlReader reader = XmlReader.Create(inputStream); 

    if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "LicensingStatus") 
    { 
     StatusLabel.Text += ("Licensing Status: " + reader.ReadString() + "<br><br>"); 
    } 
}