1

次のようなさまざまな翻訳された文字列を含むビジュアル スタジオ リソース ファイルを解析しようとしています。

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

他のものと同様に。データ名の文字列が欲しいだけです。

次を使用して、このファイルを1行ずつ解析しようとしました。

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 を正しく使用していますか

4

1 に答える 1

2

一部の要素に属性または要素dataがないようです。これを回避するには、プロパティにアクセスする代わりにキャストを使用します。それ以外の場合は、属性または要素が見つからない場合に受け取りますnamevalueValueNullReferenceExceptionnamevalue

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

別の考えられる理由は、名前空間の問題です。ただし、デフォルトのリソース ファイルには名前空間が定義されていません。

于 2013-06-14T16:03:36.793 に答える