0

xmlファイルからデータを読み取ってテキストボックスに表示しようとしていますが、最後の要素/属性、この場合は「Endurance」のみが表示されています。これが私のxmlファイルです

<?xml version="1.0" encoding="utf-8"?>
<Character>
  <Name
   Name="Test" />
   <Age
   Age="19" />
  <Class
  Class="Necromancer" />
  <Strength
  Strength="1" />
  <Dexterity
  Dexterity="2" />
  <Intelligence
  Intelligence="3" />
  <Speed
  Speed="4" />
  <Endurance
  Endurance="5" />
</Character>

読者のための私のコードは次のとおりです

XmlTextReader reader = new XmlTextReader(openFileDialog1.FileName);
while (reader.Read())
{
   if (reader.HasAttributes)
   {
     for (int i = 0; i < reader.AttributeCount; i++)
     {
       reader.MoveToAttribute(i);
       switch (reader.Name)
       {
         case "Name":
             DisplayBox.Text = "Name: " + reader.Value + "\n";
             break;
         case "Age":
             DisplayBox.Text = "Age: " + reader.Value + "\n";
             break;
         case "Class":
             DisplayBox.Text = "Class: " + reader.Value + "\n";
             break;
         case "Strength":
             DisplayBox.Text = "Strength: " + reader.Value + "\n";
             break;
         case "Dexterity":
             DisplayBox.Text = "Dexterity: " + reader.Value + "\n";
             break;
         case "Intelligence":
             DisplayBox.Text = "Intelligence: " + reader.Value + "\n";
             break;
         case "Speed":
             DisplayBox.Text = "Speed: " + reader.Value + "\n";
             break;
         case "Endurance":
             DisplayBox.Text = "Endurance: " + reader.Value + "\n";
             break;
         default:
             break;
       }
     }
         reader.MoveToElement();
  }
}

したがって、ボタンをクリックしてデータを表示するたびに、テキストボックスに表示されるのはEndurance:5だけです。

4

4 に答える 4

1

私はあなたの質問に直接答えるのではなく、代わりにコードを書く別の方法を提供します。

特に、switchステートメントは繰り返され、繰り返しは削除できます。

また、switchステートメントを使用すると、コードが特定の値にロックされます。使用する属性名のリストを動的に変更することはできません。たとえば、別の言語の場合などです。

これが私のコードです:

var xd = XDocument.Load(openFileDialog1.FileName);

var query =
    from xe in xd.Descendants()
    from xa in xe.Attributes()
    let r = map(xa.Name.ToString(), xa.Value)
    where r != null
    select r;

DisplayBox.Text = String.Join("", query);

今欠けているのは、map関数の定義だけです。これは、コードが少しエッジの効いたところです。

まず、探している名前から始めます。

var names = new []
{
    "Name", "Age", "Class",
    "Strength", "Dexterity", "Intelligence",
    "Speed", "Endurance", 
};

次に、マッピングを担当するいくつかの変数を定義する必要があります。

var nameMap =
    names
        .ToDictionary(
            n => n,
            n => (Func<string, string>)
                (t => String.Format("{0}: {1}\n", n, t)));

Func<string, string, string> map =
    (n, v) =>
        nameMap.ContainsKey(n) ? nameMap[n](v) : null;

少しトリッキーですが、名前のリストを最終的なクエリからうまく分離してデータを取得し、維持する必要がある部分のコードをきれいに保ちます。

于 2012-06-16T14:23:34.347 に答える
1

交換が必要なようです

DisplayBox.Text =

DisplayBox.Text +=

さらに、すべてのスイッチ条件は非常に似ています。したがって、次を使用できます。

string[] supportedAttributes = new []{"Name", "Age", "Class", "Strength", "Dexterity", "Intelligence", "Speed", "Endurance"};
while (reader.Read())
{
   if (reader.HasAttributes)
   {
     for (int i = 0; i < reader.AttributeCount; i++)
     {
       reader.MoveToAttribute(i);
       if(supportedAttributes.Any(a=>a == reader.Name))
           DisplayBox.Text += string.Format("{0}: {1} \n", reader.Name, reader.Value);
     }
     reader.MoveToElement();
  }
}
于 2012-06-16T13:41:44.880 に答える
0

それ以外の

    DisplayBox.Text = 

あなたはのように使うべきです

   DisplayBox.Text += 

それは必要なことをしなければならない。

于 2012-06-16T13:41:33.227 に答える
0

現在、すべてのノードをループしています。

最後に、ループは最終ノードで停止します。それは持久力ノードに他なりません。

したがって、結果は持久力として表示されます。

特定の条件を確認する必要があり、それが満たされている場合は、ループから抜け出す必要があります。

または

テキストボックスにすべての値を表示したい場合は、@ Kostyaと@Furqanの回答に従ってください。

于 2012-06-16T13:41:47.360 に答える