2016-06-28 38 views
1

我正在用C#開發我的第一個WPF應用程序,但是當我嘗試讀取Xml屬性時遇到問題。閱讀Xml屬性時出現C#錯誤

我有以下XML:

<?xml version="1.0" encoding="utf-8"?> 
<Dictionary EnglishName="Italian" CultureName="Italian" Culture=""> 
    <!-- MainWindow --> 
    <Value ID="WpfApplication1.MainWindow.BtnDrawCircle" Content="Circonferenza"/> 
    <Value ID="WpfApplication1.MainWindow.BtnDrawLine" Content="Linea"/> 
    .... 
    .... 
</Dictionary>` 

現在,我試圖讓屬性 「內容」 下面的方法:

public static string ReadNodeAttribute(string IDAttribute) 
    { 
     try 
     { 
      XmlDocument _Doc = new XmlDocument(); 
      _Doc.Load("myPath\\Language\\it-IT.xml"); 

      string _Value = _Doc.SelectSingleNode("//Value[@ID=" + IDAttribute + "]").Attributes["Content"].Value.ToString(); 

      return _Value; 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
} 

但它不工作:

錯誤:ex {「對象引用未設置爲對象的實例。」} System.Exception {System.NullReferenceException}

+1

「it dosn't work」。你能更準確地瞭解dosnt的工作原理嗎?你究竟傳遞了什麼'IDAttribute'? –

+0

IDAttribute我嘗試通過這個「WpfApplication1.MainWindow.BtnDrawCircle」....但我收到下面的錯誤:例如\t {「對象引用未設置爲對象的實例。」} \t System.Exception {系統。 NullReferenceException} – Mameo96

+0

做這件事的方法不是寫一大堆有多個失敗點的代碼,然後嘗試猜測它失敗的位置。一次構建一個小塊。首先,嘗試'var xn = _Doc.SelectSingleNode(「// Value [@ ID =」+ IDAttribute +「]」);'看看你得到了什麼'xn'。您可以在調試器中使用監視窗口。一旦找出正確的xpath表達式來獲得所需的節點,您可以在調試器中查看它的'Attributes'集合*並查看其中的內容。據我所知,文件的相對路徑可能是錯誤的。加載後檢查_Doc! –

回答

1

你有

空引用異常

因爲... e您沒有檢查null萬一您的IDAttribute不存在XML

只要改變你的路徑,它會工作。

using System; 
using System.Linq; 
using System.Xml.Linq; 

    public static string ReadNodeAttribute(string IDAttribute) 
     { 
      string _Value = ""; 
      try 
      { 
       //I used System.IO.Path.GetFullPath because I tried it with ConsoleApplication. 
       //Use what ever work for you to load the xml. 
       XDocument xdoc = XDocument.Load(System.IO.Path.GetFullPath("XMLFile1.xml")); 
       var myValue = xdoc.Descendants("Value").FirstOrDefault(i => i.Attribute("ID").Value == IDAttribute); 
       if (myValue != null) 
       { 
        _Value = myValue.Attribute("Content").Value; 

        return _Value; 
       } 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 

      return _Value; 
     } 
+1

它的工作非常感謝 – Mameo96

1

我一直在使用Linq to Xml

XDocument xdoc = XDocument.Load(Server.MapPath("path")); 
var val = xdoc.Descendants("Value").Where(i => i.Attribute("ID").Value == IDAttribute).FirstOrDefault().Attribute("Content").Value; 

中序利用這一點,你必須嘗試包括System.Xml.Linq命名空間