2013-07-05 34 views
5

Tôi đang làm việc với ASP.NET và đang nhập tệp XML từ biểu mẫu. Ngay bây giờ tôi chuyển đổi thành một số Stream:Đọc XML từ Luồng

Stream inputStream = XmlFileUploadControl.PostedFile.InputStream; 

vì tôi có thể cần phiên bản này sau.

Tôi muốn đầu tiên kiểm tra để chắc chắc chắn rằng các tập tin XML có định dạng chính xác, và, nếu có, sau đó hiển thị một số thông tin:

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

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

Phương pháp CorrectFileFormat():

protected Boolean CorrectFileFormat(Stream inputStream) 
{ 

    XmlReader reader = XmlReader.Create(inputStream); 

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

Các DisplayLicenseInfo() phương pháp:

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

} 

Tuy nhiên, tôi gặp phải một số XmlException cho biết "Dữ liệu ở cấp cơ sở không hợp lệ. Dòng 1, vị trí 1 ". Đây có phải là vì tôi đã đọc qua luồng đầu vào một lần và cần phải đặt lại luồng đó không? Nếu vậy, làm cách nào để thực hiện điều đó?

+1

giá trị của chuỗi là gì? Nó có lẽ là 'FEFF' pesky ... –

Trả lời

5

Lần đầu tiên bạn tạo XmlReader xung quanh luồng , đó là ở vị trí 0. Nhưng lần thứ hai bạn tạo một số XmlReader, luồng đã được đọc một phần, do đó, nó không còn ở vị trí 0 nữa, vì vậy, XmlReader không thể đọc tài liệu XML.

Thay vào đó, bạn chỉ nên tạo XmlReader một lần:

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

Nếu tệp là nhỏ, bạn cũng có thể xem xét tải toàn bộ tài liệu XML sử dụng XmlDocument hoặc XDocument (LINQ to XML)

+0

Cảm ơn, đó là những gì tôi đã tự hỏi. Không có vấn đề với đọc vào một đối tượng 'XmlReader', như sẽ được thực hiện trong phương pháp đầu tiên, hoặc sẽ là phương pháp thứ 2 vẫn bắt đầu từ đầu? –

+0

Trong khi điều này chắc chắn đi đúng hướng, và đưa tôi đến phương thức Display(), nó sẽ làm một điều gì đó với câu lệnh mà tôi thực hiện trong phương thức đó, nơi nó không còn hoạt động nữa. Bất kỳ ý tưởng? –

+0

@Adam_G, phương pháp thứ hai sử dụng cùng một trình đọc sẽ tiếp tục từ vị trí hiện tại. Về câu hỏi thứ hai của bạn, bạn cần phải chính xác hơn ... ý của bạn là gì bởi "nó làm điều gì đó với tuyên bố"? Và làm thế nào chính xác nó "không còn làm việc"? –

4

@ thomas-Levesque https://stackoverflow.com/users/98713/thomas-levesque được ngay, nếu nội dung chính nó là tốt được hình thành, thì bạn cần phải tua lại dòng trở lại bắt đầu nội dung.() Phương pháp

Các 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; 
    } 
} 

Các DisplayLicenseInfo() phương pháp:

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