2013-07-05 24 views
5

Sto lavorando con ASP.NET e sto importando un file XML da un modulo. In questo momento mi convertire in un Stream:Lettura XML da Stream

Stream inputStream = XmlFileUploadControl.PostedFile.InputStream; 

perché posso avere bisogno di questa versione successiva.

mi piacerebbe controllare primo a fare assicurarsi che il file XML ha il formato corretto, e, se lo è, allora visualizzare alcune informazioni:

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

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

Il metodo CorrectFileFormat():

protected Boolean CorrectFileFormat(Stream inputStream) 
{ 

    XmlReader reader = XmlReader.Create(inputStream); 

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

Il metodo DisplayLicenseInfo():

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>"); 
    } 

} 

Tuttavia, sono incontrando un XmlException che dice "I dati a livello di root non sono validi. Riga 1, posizione 1 ". È perché ho già letto il flusso di input una volta e devo ripristinarlo? Se sì, come faccio?

+1

Qual è il valore della stringa? Probabilmente è quel fastidioso 'FEFF' ... –

risposta

5

La prima volta che si crea uno XmlReader in tutto lo stream , è nella posizione 0. Ma la seconda volta che si crea uno XmlReader, lo stream è già stato letto parzialmente, quindi non è più in posizione 0, quindi XmlReader non può leggere il documento XML

Invece, è necessario creare l'XmlReader solo una volta:

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

Se il file è piccolo, si potrebbe anche prendere in considerazione di caricare l'intero documento XML utilizzando XmlDocument o XDocument (LINQ to XML)

+0

Grazie, è quello che mi stavo chiedendo. Non ci sono problemi con la lettura in un oggetto 'XmlReader', come si farebbe nel primo metodo, o il secondo metodo dovrebbe ancora iniziare all'inizio? –

+0

Mentre questo sicuramente va nella giusta direzione, e mi porta al metodo Display(), poi fa qualcosa alla dichiarazione che eseguo in quel metodo, dove non funziona più. Qualche idea? –

+0

@Adam_G, il secondo metodo che utilizza lo stesso lettore continuerà dalla posizione corrente. Per quanto riguarda la tua seconda domanda, devi essere più preciso ... cosa intendi con "fa qualcosa per l'affermazione"? E in che modo esattamente "non funziona più"? –

4

@ thomas-Levesque https://stackoverflow.com/users/98713/thomas-levesque aveva ragione, se il contenuto stesso è ben formato, allora avete bisogno di riavvolgere il flusso di nuovo a l'inizio del contenuto. Metodo

Il CorrectFileFormat():

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; 
    } 
} 

Il metodo DisplayLicenseInfo():

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>"); 
    } 
}