2011-12-10 40 views
21

Nếu bất kỳ ai có thể giải thích lý do tại sao tôi gặp lỗi "Phần tử gốc bị thiếu" khi tài liệu XML của tôi (hình ảnh đính kèm) có phần tử gốc, chúng giành được một con ngựa làm cho lazer bị lóe lên.Lỗi "Phần tử gốc bị thiếu" nhưng tôi có phần tử gốc

enter image description here

Code:

if (ISF.FileExists("Players.xml")) 
{ 
    string xml; 
    using (IsolatedStorageFileStream rawStream = ISF.OpenFile("Players.xml", FileMode.Open)) 
    { 
     StreamReader reader = new StreamReader(rawStream); 
     xml = reader.ReadToEnd(); 
      XmlReaderSettings settings = new XmlReaderSettings { IgnoreComments = true, IgnoreWhitespace = true }; 
     XmlReader xmlReader = XmlReader.Create(reader, settings); 
     while (xmlReader.Read()) 
     { 
      switch (xmlReader.NodeType) 
      { 
       case XmlNodeType.Element: 
        switch (xmlReader.Name) 
        { 
         case "numberOfPlayers": 
          string nodeValue = xmlReader.ReadContentAsString(); 
          int NODEVALUE = int.Parse(nodeValue); 
          MessageBox.Show(" " + NODEVALUE); 
          break; 
        } 
        break; 
      } 
      break; 
     } 
     reader.Close(); 
    } 
} 
+1

thẻ không phải được sử dụng theo cách mà bạn đang sử dụng chúng ... mỗi thẻ cần xác định chủ đề trong câu hỏi ... – mtahmed

+0

bất kỳ lý do cụ thể bạn đang sử dụng 'XmlReader' đây? – BrokenGlass

+0

Im hoàn toàn mới để đọc XML trong C# ... đó có lẽ là lý do tôi đang sử dụng XmlReader. Tôi không hiểu ý nghĩa của mtahmed là gì? – DanTonyBrown

Trả lời

42

Vấn đề của bạn là do dòng này:

xml = reader.ReadToEnd(); 

này vị trí dòng đầu đọc đến cùng để khi XmlReader.Create được thực thi, có không còn gì trong luồng để đọc.

Nếu bạn cần chuỗi xml được điền, thì bạn cần đóng và mở lại trình đọc trước XmlReader.Create. Nếu không, việc xóa hoặc nhận xét dòng này sẽ giải quyết được sự cố của bạn.

+0

Câu trả lời đúng, cảm ơn :) – DanTonyBrown

+0

@DanTonyBrown: Vui vì tôi có thể giúp. Nhớ nhấp vào dấu kiểm và mũi tên lên bên cạnh bất kỳ câu trả lời nào giải quyết hoặc giúp bạn giải quyết vấn đề của mình để khách truy cập trong tương lai đặt câu hỏi sẽ biết rằng điều này phù hợp với bạn. –

+0

Nếu tôi biết XML tốt hơn, có thể * Tôi sẽ * là người nhận được một con ngựa bắn laser;) –

4

Đặt lại vị trí của luồng cơ sở mỗi lần đọc nếu bạn muốn đọc từ đầu như đã nêu trước đó, nhưng bạn không phải tạo lại luồng mỗi lần.

String xmlResource = Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd"; 
configXsd = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(xmlResource)); 
if (configXsd != null) 
    { 
    configXsd.BaseStream.Position = 0; 

    File.WriteAllText(apppath + @"\" + Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd", configXsd.ReadToEnd()); 
    } 
0

tôi đã kết thúc việc tạo ra một chức năng nhỏ nhanh chóng để tham khảo trước mỗi XmlReader mới ...

private void ResetStream() 
{ 
    /* 
    The point of this is simply to open the stream with a StreamReader object 
    and set the position of the stream to the beginning again. 
    */ 

    StreamReader reader = new StreamReader(m_stream); 

    if (reader != null) 
    { 
     reader.BaseStream.Position = 0; 
    } 
} 

Vì vậy, khi tôi đang làm việc trong xml Tôi gọi nó là ngay trước khi tôi tạo độc giả của tôi. Tôi luôn luôn có cùng một dòng trong bộ nhớ và không bao giờ tái tạo điều đó.

ResetStream(); 
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); } 
Các vấn đề liên quan