2015-11-23 225 views
-3

所以我是C#總noob有沒有什麼辦法使這項工作? 如果有人能解釋爲什麼我的系統無法正常工作,以及爲什麼會有另一個版本,這也將是一個很大的幫助。有沒有什麼辦法可以讓我的C#XMLManager工作?

using System; 
using System.Xml; 

public class XMLManager 
{ 
    private XmlTextReader reader; 
    private XmlDocument document; 
    private XmlNodeList nodeList; 

    public void OpenFile(string file) 
    { 
     try 
     { 
      reader = new XmlTextReader(file); 
      reader.WhitespaceHandling = WhitespaceHandling.None; 
      reader.MoveToContent(); 
      document = new XmlDocument(); 
      document.Load(reader); 
      nodeList = document.SelectNodes(@"Settings/Settings"); 
     } 
     catch (System.IO.FileNotFoundException) 
     { 
     } 
    } 

    public void CloseFile() 
    { 
     if (reader != null) 
     { 
      ((IDisposable)reader).Dispose(); 
      reader.Close(); 
      reader = null; 
     } 
     document = null; 
     nodeList = null; 
    } 

    public string Get(string attrib) 
    { 
     for (int i = 0; i < nodeList.Count; i++) 
     { 
      reader.MoveToAttribute(i); 
      if (reader.Name == attrib) 
      { 
       return reader.Value; 
      } 
     } 
     return null; 
    } 
} 

編輯:對不起,我的格式不好,這是我第一次發佈堆棧溢出。

+0

有人應該如何告訴你爲什麼你的系統沒有工作..也沒有什麼'行不通平均???'你也應該使用調試器,並通過您的代碼步..如果它是你的機器怎麼你不能調試它..?此外..這不是一個代碼工廠/測試網站..再次..'Debugger'是你的朋友,如果你知道如何正確使用它 – MethodMan

+0

定義「工作」;你不期望發生了什麼,或者你期望發生了什麼? –

+0

您遇到的問題是什麼?你說*我的系統不工作*但不描述問題。看看[我如何問一個好問題?](http://stackoverflow.com/help/how-to-ask)。很好,你展示的代碼不起作用 - 現在,告訴我們它做錯了什麼,包括導致問題的XML示例。 – dbc

回答

0

您在這裏犯了很多錯誤。

首先,您不需要閱讀器將xml內容讀取到XmlDocument中。

其次,在嘗試獲取屬性時,嘗試使用顯然不具有所選節點上下文的閱讀器繼續閱讀屬性。

這是您更新的XmlManager,但我必須注意,也有一個邏輯錯誤,也就是說,當調用GetAttribute時,您正在搜索所有Settings/Settings節點,並且如果在其中找到任何屬性, 把它返還。如果xml文件僅包含一個「設置/設置」節點,則SelectSingleNode更好。我假設如下格式:

<Settings> 
    <Settings attr1="attr1val" attr2="attr2val" /> 
    </Settings> 

注:我也刪除了CloseFile方法,因爲它不再需要。

public class XMLManager 
{ 
    private XmlDocument document; 
    private XmlNodeList nodeList; 

    public void OpenFile(string file) 
    { 
     document = new XmlDocument(); 
     document.Load(file); 
     nodeList = document.SelectNodes(@"Settings/Settings"); 
    } 

    public string Get(string attrib) 
    { 
     for (int i = 0; i < nodeList.Count; i++) 
     { 
      if (nodeList[i].Attributes[attrib] != null) 
      { 
       return nodeList[i].Attributes[attrib].Value; 
      } 
     } 
     return null; 
    } 
} 
+0

非常感謝這個偉大的解釋和固定的代碼,幫助我理解'System.Xml'通常會更好。另外'SelectSingleNode'正是我正在尋找的東西。 – CSharpNoob

+0

只是想確保我能得到它的工作,效果很好。謝謝! – CSharpNoob

+0

發佈之前測試:)謝謝 –

0

總的來說,你的工作太多了。

如果您在一個文件中包含XML,請使用XmlDocument.Load(strFileName)將其直接加載到XML(DOM)對象中;

要迭代所有匹配XPath查詢的節點,請參閱我如何貫穿它們。

try { 
     string strFileName = HttpContext.Current.Server.MapPath("\\data.xml"); 
     XmlDocument xml = new XmlDocument(); 
     xml.Load(strFileName); 
     foreach (XmlElement ndRow in xml.SelectNodes("//row")) { 
      string strTemp = ndRow.GetAttribute("foo"); 
     } 
    } catch (Exception ex) { 
     Response.Write(ex.Message); 
    } 
相關問題