2012-04-19 123 views
0

的副本當我嘗試閱讀我的XML文件,它似乎讀了兩遍,即時通訊,就如何解決這樣的錯誤不能確定。我以爲我可以有某種循環,但我仍然輸了。任何幫助將不勝感激ty。 - 它正確地寫入xml文件,但在讀取它時發生重複。當我讀XML文件讀取節點

String workingDir = Directory.GetCurrentDirectory(); 
XmlTextReader textReader = new XmlTextReader(workingDir + @"\xmldoc.xml"); 

Console.WriteLine("BaseURI:" + textReader.BaseURI); 
textReader.Read(); 

while (textReader.Read()) 
{ 
    if (textReader.Name == "test") 
    { 

     textReader.Read(); 
     XmlNodeType nType = textReader.NodeType; 

     if (nType == XmlNodeType.Text) 
     { 
      // label.Text = textReader.Value.ToString(); 
      Label l = new Label(); 
      System.Drawing.Point l1 = new System.Drawing.Point(15, 13 + a); 
      l.Location = l1; 
      l.Text = textReader.Value.ToString(); 

      a += 20; 
     } 
+4

你怎麼看到這一點 - '它似乎讀取它twice'? – sll 2012-04-19 16:06:02

+2

如果它不是敏感數據,您是否也可以發佈正在讀取的XML樣本?它可能有助於確定發生了什麼。另外,如果你不期待巨大的輸入,那麼使用XmlDocument(或者如果你感覺LINQ-y是XDocument)可能會更直觀;我總是發現XmlReader導致更醜陋的代碼:) – LexyStardust 2012-04-19 16:18:22

+2

僅供參考,您不應該使用'new XmlTextReader()'。自.NET 2.0以來,這已被棄用。改用'XmlReader.Create()'。 – 2012-04-19 20:48:14

回答

0

是什麼讓你覺得有些條目讀兩遍?如果是這樣的話,還要檢查這個方法是否被調用兩次(在Visual Studio中shift + F12以查找使用情況)。 此外,似乎這一條,你在這裏加入的代碼是不完整的(無變量a的聲明)。你有下if (textReader.Name == "test"),會做同樣的操作執行一些代碼?

0

我不知道你真正想要做的,沒有你的XML的知名度,但這裏是我大概會怎麼做。

注:

  1. 我使用一個XmlReader < - 恕我直言更好(基類,所以有較少的華夫)
  2. 我使用 「reader.Value」 沒有的ToString(),因爲它是已經是字符串類型。
  3. 我改變它是一個開關,因爲我認爲它們更乾淨,但有很多XmlNodeTypes在那裏,你不想要如果/其他很多!

代碼:

 XmlReader reader = XmlReader.Create("books.xml"); 
     while (reader.Read()) 
     { 
      switch (reader.NodeType) 
      { 
       case XmlNodeType.Element: // The node is an element. 
        //DO NOTHING 
        break; 
       case XmlNodeType.Text: //Display the text in each element. 
        //label.Text = reader.Value; 
        Label l = new Label(); 
        System.Drawing.Point l1 = new System.Drawing.Point(15, 13 + a); 
        l.Location = l1; 
        l.Text = reader.Value; 
        a += 20; 
        break; 
       case XmlNodeType.EndElement: //Display the end of the element. 
        //DO NOTHING 
        break; 
      } 
     }