2

状況: XML ファイルがあります (ほとんどの場合、多数のブール論理)。私がやりたいこと: そのノードの属性の内部テキストによってノードのインデックスを取得します。次に、指定されたインデックスに子ノードを追加します。

例:

<if attribute="cat">
</if>
<if attribute="dog">
</if>
<if attribute="rabbit">
</if>

特定の要素名のインデックス リストを取得できます

GetElementsByTagName("if");

しかし、属性の内部テキストを使用して、ノード リスト内のノードのインデックスを取得するにはどうすればよいでしょうか。

基本的には、

Somecode.IndexOf.Attribute.Innertext("dog").Append(ChildNode);

これで終わりにします。

<if attribute="cat">
</if>
<if attribute="dog">
    <if attribute="male">
    </if>
</if>
<if attribute="rabbit">
</if>

ノードを作成してインデックスに挿入しても問題ありません。インデックスを取得する方法が必要です。

4

2 に答える 2

2

linq select 関数には、現在のインデックスを提供するオーバーライドがあります。

            string xml = @"<doc><if attribute=""cat"">
</if>
<if attribute=""dog"">
</if>
<if attribute=""rabbit"">
</if></doc>";

            XDocument d = XDocument.Parse(xml);

            var indexedElements = d.Descendants("if")
                    .Select((node, index) => new Tuple<int, XElement>(index, node)).ToArray()  // note: materialise here so that the index of the value we're searching for is relative to the other nodes
                    .Where(i => i.Item2.Attribute("attribute").Value == "dog");


            foreach (var e in indexedElements)
                Console.WriteLine(e.Item1 + ": " + e.Item2.ToString());

            Console.ReadLine();
于 2013-05-08T08:59:53.843 に答える
1

完全を期すために、これは上記のネイサンの回答と同じですが、タプルの代わりに匿名クラスのみを使用しています。

using System;
using System.Linq;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            string xml = "<root><if attribute=\"cat\"></if><if attribute=\"dog\"></if><if attribute=\"rabbit\"></if></root>";
            XElement root = XElement.Parse(xml);

            int result = root.Descendants("if")
                .Select(((element, index) => new {Item = element, Index = index}))
                .Where(item => item.Item.Attribute("attribute").Value == "dog")
                .Select(item => item.Index)
                .First();

            Console.WriteLine(result);
        }
    }
}
于 2013-05-08T09:09:47.650 に答える