2016-06-28 3 views
1

Я разрабатываю свое первое приложение WPF с C#, но у меня есть проблема, когда я пытаюсь прочитать атрибут Xml.C# Ошибка при чтении Xml Атрибут

У меня есть следующий 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

«это не работает». Можете ли вы быть более spesific о том, что dosnt работает точно? Что именно вы передаете для 'IDAttribute'? –

+0

В IDAttribute Я пытаюсь передать этот «WpfApplication1.MainWindow.BtnDrawCircle» .... но я получаю следующую ошибку: ex \t {«Ссылка на объект не установлена ​​в экземпляр объекта.»} \t System.Exception {System. NullReferenceException} – Mameo96

+0

Способ сделать это - не писать большой код кода с несколькими точками сбоя, а затем попытаться угадать, где он не удалось. Постройте его по одному маленькому кусочку за раз. Сначала попробуйте 'var xn = _Doc.SelectSingleNode (" // Value [@ ID = "+ IDAttribute +"] ");' и посмотрим, что вы получите для 'xn'. Вы можете использовать окно просмотра в отладчике. Когда вы выберете правильное выражение xpath, чтобы получить нужный вам узел, вы можете посмотреть его коллекцию «Атрибуты» в отладчике * и посмотреть, что там находится. Насколько мне известно, относительный путь к вашему файлу может быть неправильным. Проверьте _Doc после загрузки! –

ответ

1

вы получили

пустая ссылка исключение

becaus 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; 

Inorder использовать это вы должны включить System.Xml.Linq Namespace

Смежные вопросы