1

わかりましたので、次の XML があります。

<root>
    <item id="1" level="1" />
    <item id="2" level="1">
        <item id="3" level="2"/>
        <item id="4" level="2">
            <item id="5" level="3">
                <item id="6" level="4" />
            </item>
        </item>
        <item id="7" level="2" />
    </item>
</root>

辞書の出力をこのようにしたいので、データをSQLデータベースに挿入できます。

ID | ParentID  | level
------------------------
1     NULL         1
2     NULL         1
3      2           2
4      2           2
5      4           3
6      5           4
7      2           2

現在、これは最初の 2 列を取得するための私のコードですが、3 列目の「レベル」を辞書に表示する方法がわかりません。

XElement root = XElement.Parse(strSerializedoutput);
Dictionary<int, int> list = root.Descendants("item").ToDictionary(x => (int)x.Attribute("id"), x =>
    {
        var parentId = x.Parent.Attribute("id");
        if (parentId == null)
            return 0;
        return (int)parentId;
    });
4

2 に答える 2

1

実際には、 use a を使用しDataTableますが、潜在的に匿名型も使用できます。

XElement root = XElement.Parse(strSerializedoutput);
var list = root.Descendants("item")
    .ToDictionary(x => (int)x.Attribute("id"), x =>
    {
        var parentId = (int)x.Parent.Attribute("id");
        var level = (int)x.Parent.Attribute("level");

        return new { ParentID = parentId, Level = level };
    });

たとえば、最終的に DB に書き込むときは、 and を使用list.ParentIDlist.Levelます。

于 2013-10-07T14:09:32.010 に答える
0
SELECT  y.targetelement, y.[Columns], y.[ColumnsAsXml],
        y.ColumnsAsXml.value('(item/text())[1]','NVARCHAR(100)') AS COLUMN_1,
        y.ColumnsAsXml.value('(item/text())[2]','NVARCHAR(100)') AS COLUMN_2,
        y.ColumnsAsXml.value('(item/text())[3]','NVARCHAR(100)') AS COLUMN_3,
        y.ColumnsAsXml.value('(item/text())[4]','NVARCHAR(100)') AS COLUMN_4
FROM
(
    SELECT  x.*, CONVERT(XML, N'<item>' + REPLACE(x.[Columns], N'->', N'</item> <item>') + N'</item>') AS ColumnsAsXml
    FROM    
    (
        SELECT 'TEST1', NULL UNION ALL
        SELECT 'TEST2', NULL UNION ALL
        SELECT 'TEST3', 'TEST2->TEST3' UNION ALL
        SELECT 'TEST4', 'TEST2->TEST4' UNION ALL
        SELECT 'TEST7', 'TEST2->TEST7' UNION ALL
        SELECT 'TEST6', 'TEST2->TEST4->TEST5->TEST6' UNION ALL
        SELECT 'TEST5', 'TEST2->TEST4->TEST5'   
    ) x(targetelement, [Columns])
) y
于 2013-10-08T19:09:23.740 に答える