读取LINQ和XDocument的结果

时间:2013-06-14 15:58:32

标签: c# xml linq linq-to-xml

我正在尝试解析包含各种翻译字符串的visual studio资源文件,如下所示:

<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
}

问题是,当我到达我的foreach循环时,我得到一个异常或: “MyProgram.exe中发生了'System.NullReferenceException'类型的未处理异常。 对象引用未设置为对象的实例“

有谁知道为什么?我正确使用LINQ

1 个答案:

答案 0 :(得分: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")
             };

另一个可能的原因是命名空间问题。但是默认资源文件没有定义名称空间。