2013-06-14 3 views
1

Я пытаюсь разобрать Visual Studio файл ресурса, который содержит различные переведённые строки следующим образом:Чтение результата LINQ и XDocument

<data name="InvalidGroupType" xml:space="preserve"> 
    <value>La sélection du type de groupe n'est pas valide.</value> 
</data> 
<data name="ProgressFailure" xml:space="preserve"> 
    <value>Liste des échecs</value> 
</data> 
<data name="Loronix" xml:space="preserve"> 
    <value>Loronix</value> 
</data> 
<data name="InputString" xml:space="preserve"> 
    <value>Entrée</value> 
</data> 

, а также другие вещи. Я просто хочу, чтобы имя и значение строки.

Я пытался разобрать этот файл построчно, используя следующие:

StreamReader fileMain = new StreamReader(MainFile); 
while ((line = fileMain.ReadLine()) != null) 
{ 
    string data = checkForData(line); --checks each line for "<data name=" 
    if(data.Length > 0) 
     StringsToTranslatelist.Add(data); 
} 

Но я догадался, что должно быть лучший способ сделать это. Таким образом, я использовал LINQ, как так:

XDocument xDoc = XDocument.Load(resxFile); 

var result = from item in xDoc.Descendants("data") 
select new 
{ 
    Name = item.Attribute("name").Value, 
    Value = item.Element("value").Value 
}; 

foreach (var entry in result) 
{ 
    string name = entry.Name; 
    string value = entry.Value; 
    //Do somethign here 
} 

Проблема заключается в том, что, когда я доберусь до своего цикла Еогеаспа я получаю исключение или: «Необработанное исключение типа„System.NullReferenceException“произошло в myprogram.exe . Ссылка на объект не установлена ​​в экземпляр объекта "

Кто-нибудь знает, почему? Я использую LINQ правильно

+0

В какой строке он выделяется? –

+0

Я угадываю либо item.Attribute («name»). Значение или item.Element («value»). Значение –

+0

Оно не выделяет ни одной строки. Он выходит за оператор LINQ, а затем, когда dubugger попытался сделать первый цикл foreach, отладчик появляется, чтобы вернуться к выбору нового оператора, а затем я получаю ошибку. –

ответ

2

Похоже, что какой-то элемент data не имеет атрибута name или value. Чтобы этого избежать - используйте отливку вместо доступа к объекту Value. В противном случае вы получите NullReferenceException если либо name атрибута или value элемента не найден

var result = from item in xDoc.Descendants("data") 
      select new { 
       Name = (string)item.Attribute("name"), 
       Value = (string)item.Element("value") 
      }; 

Другой возможной причиной является проблемой пространства имен. Но в файлах ресурсов по умолчанию нет именных пространств.

+0

Я изменил его на это, и его больше не сбой. Но он возвращает «null» для всех записей «entry.value». Пример FOr: у моего файла ресурсов есть La sélection du type de groupe, но значение возвращается как null. –

+0

@HarryBoy только что подтвержден - отлично работает в файле ресурсов по умолчанию. У вас есть какое-то пространство имен, определенное в вашем XML-файле? –

+1

Извинения, я забыл изменить item.Attribute ("value"). Значение item.Element ("value"). Теперь он работает спасибо :) –

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