1

次の XML コードがあります。

<Presets>
  <Preset ID="0" Name="aaaa">
    <IncludedChampions>
      <ID>5</ID>
      <ID>6</ID>
      <ID>7</ID>
    </IncludedChampions>
  </Preset>
  <Preset ID="1" Name="some">
    <IncludedChampions>
      <ID>4</ID>
      <ID>5</ID>
      <ID>6</ID>
    </IncludedChampions>
   </Preset>
</Presets>

そして、私はこれでそれを解析しようとしています:

XmlReader reader = XmlReader.Create("./config.xml");
while (reader.Read())
{
   while (reader.ReadToFollowing("Preset"))
   {
       presetList.Add(new Preset());
       presetList[presetList.Count - 1].name = reader.GetAttribute(1);
       Console.WriteLine("Preset list ID " + Convert.ToString(presetList.Count - 1));

      while (reader.ReadToFollowing("ID"))
      {
         Console.WriteLine("Champion ID " + reader.ReadElementContentAsString());
      }
   }
}

しかし、出力には「Preset list ID 0」とすべての ID しか表示されません。他のプリセット ID はどこに行ったのですか? ありがとう!

4

1 に答える 1

4

XmlReader.ReadToFollowing次のように文書化されています。

指定された修飾名を持つ要素が見つかるまで読み取ります。

さて、最初の Preset の ID 7 から、「ID」という名前の「次の次の要素」は何ですか? もちろん ID 4 です...兄弟だけを検索するわけではありません。

Nick が示唆するように、LINQ to XML を使用すると、これがはるかに簡単になります...または、XmlDocument本当に .NET 2 に行き詰まっている場合は、モデルだけでもかまいません。

関連する LINQ to XML コードは次のとおりです。

XDocument doc = XDocument.Load("config.xml");
foreach (var element in doc.Descendants("Preset"))
{
    var preset = new Preset { name = element.Attribute("Name").Value };
    presetList.Add(preset);
    Console.WriteLine("Preset list ID " + preset);
    foreach (var id in element.Descendants("ID"))
    {
        Console.WriteLine(id.Value);
    }
}
于 2012-07-17T20:37:24.610 に答える