将重复的数据表记录合并到XML文档中

时间:2013-05-14 17:03:56

标签: c# asp.net xml datatable hierarchy

我有一个带有category / subcategory记录的数据表,格式如下:

hierarchy  id1   cat1   id2    cat2         id3    cat3
        4  3105  Mens   3195    Shorts      3130    Shorts
        4  3105  Mens   3195    Shorts      3196    Swim Shorts
        4  3105  Mens   3177    Knitwear    3118    Jumpers
        4  3105  Mens   3177    Knitwear    3178    Cardigans
        4  3105  Mens   3177    Knitwear    3814    V-Neck Knitwear

我正在尝试将其转换为xml,格式如下:

<CATEGORY  NAME="mens">
        <CATEGORIES NAME="Shorts" />
            <CATEGORIES NAME="Shorts" />
            <CATEGORIES NAME="SwimShorts" />
        <CATEGORIES NAME="Knitwear" />
           <CATEGORIES NAME="Jumpers" />
           <CATEGORIES NAME="Cardigans" />
           <CATEGORIES NAME="V-Neck Knitwear" />

但我能得到的最好的是:

 <CATEGORY  NAME="Mens">
        <CATEGORIES NAME="Knits" />
        <CATEGORIES NAME="Crew Neck Knitwear" />
 </CATEGORY>
 <CATEGORY NAME="Mens">
        <CATEGORIES NAME="Knits" />
        <CATEGORIES NAME="Cardigans" />

正如您所看到的那样,我不想要重复。我知道我需要以某种方式合并或删除。

我将数据作为AsEnumerable()返回,然后执行foreach并为子类别创建顶级类别和子XElements的XElement:

var e = new XElement("CATEGORY", new XAttribute("ID", item["did1"]), new XAttribute("NAME", item["name1"]),
                        item["did2"].ToString() != "" ? new XElement("CATEGORIES", new XAttribute("ID", item["did2"]), new XAttribute("NAME", item["name2"])) : null,
                        item["did3"].ToString() != "" ? new XElement("CATEGORIES", new XAttribute("ID", item["did3"]), new XAttribute("NAME", item["name3"])) : null,
                        item["did4"].ToString() != "" ? new XElement("CATEGORIES", new XAttribute("ID", item["did4"]), new XAttribute("NAME", item["name4"])) : null
                    );

我对于用于产生结果的技术并不挑剔。

1 个答案:

答案 0 :(得分:0)

这样的事情

var X = from item in Data
        group item by item.cat1 into g
        select new XElement(
            "CATEGORY",
            new XAttribute("NAME", g.Key),
            from it in g
            group it by it.cat2 into k
            select new XElement("CATEGORIES2", new XAttribute("NAME", k.Key),
                from i in k.Select(x=>x.cat3).Distinct()
                select new XElement("CATEGORIES3", new XAttribute("NAME",i))
                )
        );