3

次のような大きな XML ツリーがあります。

<CategoryArray>
  <Category Name="Antiques" ID="20081">
    <Category Name="Antiquities" ID="37903">
      <Category Name="The Americas" ID="37908" />
      <Category Name="Byzantine" ID="162922" />
      <Category Name="Celtic" ID="162923" />
      <Category Name="Egyptian" ID="37905" />
      ...

すべてのノードを繰り返し処理してコントロールを設定したいのですが、その際に、次のことを確認します:このノードは親ノードの葉ですか? これを行う最も簡単な方法は何ですか?

4

3 に答える 3

6

リーフ ノードは子を持たないノードであるため、子があるかどうかを簡単に確認できます。XML ドキュメントをロードする方法に応じて、さまざまな方法があります。たとえば、HasChildNodesプロパティを使用できます。

if (myXmlNode.HasChildNodes) 
    //is not a leaf  
else 
    //is a leaf
于 2013-04-21T17:43:37.960 に答える
0

最初flattenに階層を作成します-たとえば、この投稿のコードを使用して、
LINQ to Entityを使用して再帰的にネストされたエンティティを選択するにはどうすればよいですか

するとこんなものが・・・

using (XmlReader reader = XmlReader.Create(new StringReader(this.XML)))
{
    XElement xml = XElement.Load(reader);

    var all = xml.Elements("Category").Flatten(x => x.Elements("Category"));
    var leafs = from cat in all
                where cat.Elements("Category").Any() == false
                select cat;

    // or go through all...
    var categories =
        from cat in all
        select new
        {
            Name = cat.Attribute("Name"),
            ID = cat.Attribute("ID"),
            IsLeaf = cat.Elements("Category").Any() == false,
            SubCount = cat.Elements("Category").Count(),
            // Subs = cat.Elements("Category").Select(x => x.Attribute("Name").ToString()).ToArray(),
        };

    // or put into dictionary etc.
    var hash = categories.ToDictionary(x => x.Name);
}
于 2013-04-21T18:39:37.977 に答える