2

以下のようなxmlがあります。

<rowset>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
</rowset>

私が探しているのは、リストを返すことです。これにより、各行がリスト項目になり、属性がサブ項目になります。私が持っている最も近いのは次のステートメントですが、カウントして表示すると、デバッグで表示できる値を返すことができません。

var skillslist = testmultilist.Descendants("row").Select(a => a.Attributes()).ToList();

どんな助けでも大歓迎です。

これが私が最後にやった方法です。

var skillslist = testmultilist.Descendants("row").Select(a => a.Attributes().Select(c => c.Value).ToList()).ToList();

「string derp = testmultilist[6][3]」を使用して文字列を取得できます。これにより、7 行目の 4 番目の somevalue が得られます。

4

1 に答える 1

0

あなたのコメントに基づいて更新

「私が探していたのは、この「testmultilist[0][2]」に似た何かを実行できるようにすることでした。これは、最初の行から somevalue3 を返しますが、正しい方法で行っているかどうかはわかりません。」

ここでも、属性値のIEnumerable<XAttribute>代わりに選択していたことを除いて、かなり似ていました。List<string>

これを行う方法は次のとおりです(これにつまずいた人のためにコメントしました:

    var skillslist = testmultilist.Elements("row")            // Get the Elements
        .Select(e => e.Attributes()                           // Select the attributes per element (returns IEnumerable<XAttribute>)
            .Select(a => a.Value)                             // Working on the attributes, get only the value
            .ToList()                                         // Must be a list here in order to use indexer [] to access items; this creates the innter List<> items
        )                                                     // this completes the selection of each outer "row" item
        .ToList();

アプリのテスト:

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

namespace XLinqAttributeGetNames
{
    class Program
    {
        static void Main(string[] args)
        {
            XElement testmultilist = XElement.Parse(@"<rowset>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                </rowset>");

            var skillslist = testmultilist.Elements("row")
                .Select(s => s.Attributes()
                    .Select(a => a.Value)
                    .ToList()
                )
                .ToList();

            for (var i = 0; i < skillslist.Count; i++)
            {
                Console.WriteLine("Row " + i);
                for (var j = 0; j < skillslist[i].Count(); j++)
                {
                    Console.WriteLine("Item " + j + ": " + skillslist[i][j]);
                }
                Console.WriteLine();
            }
            Console.ReadKey();

        }
    }
}
于 2013-03-13T19:11:16.827 に答える