2015-11-23 167 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); 
    } 
相关问题