【问题标题】:How to group XML data using LINQ in C#.net?如何在 C#.net 中使用 LINQ 对 XML 数据进行分组?
【发布时间】:2011-12-20 19:50:59
【问题描述】:

我想使用 C#.net 读取一个 xml 文件,并在 LINQ 的帮助下,我想根据 INSTANCE 和 CINSTANCE 值对 xml 中的节点进行分组。我怎样才能做到这一点? 这是我的源架构:

<XYZ>
    <TYPE>A</TYPE>
    <INSTANCE>1357599</INSTANCE>
    <CHILD>DESCRIPTION</CHILD>
    <CINSTANCE>PQR</CINSTANCE>
    <CPOS>0000</CPOS>
    </XYZ>

    <XYZ>
    <TYPE>GP</TYPE>
    <INSTANCE>1472422</INSTANCE>
    <CHILD>A</CHILD>
    <CINSTANCE>1357599</CINSTANCE>
    <CPOS>0010</CPOS>
    </XYZ>

    <XYZ>
    <TYPE>GP</TYPE>
    <INSTANCE>1472427</INSTANCE>
    <CHILD>A</CHILD>
    <CINSTANCE>1357599</CINSTANCE>
    <CPOS>0010</CPOS>
    </XYZ>

    <XYZ>
    <TYPE>A</TYPE>
    <INSTANCE>1357600</INSTANCE>
    <CHILD>DESCRIPTION</CHILD>
    <CINSTANCE>PQR</CINSTANCE>
    <CPOS>0000</CPOS>
    </XYZ>

    <XYZ>
    <TYPE>GP</TYPE>
    <INSTANCE>1472425</INSTANCE>
    <CHILD>A</CHILD>
    <CINSTANCE>1357600</CINSTANCE>
    <CPOS>0010</CPOS>
    </XYZ>

    <XYZ>
    <TYPE>GP</TYPE>
    <INSTANCE>1472426</INSTANCE>
    <CHILD>A</CHILD>
    <CINSTANCE>1357600</CINSTANCE>
    <CPOS>0010</CPOS>
    </XYZ>

这应该是我的输出:

<Group>
    <XYZ>
<TYPE>A</TYPE>
<INSTANCE>1357599</INSTANCE>
<CHILD>DESCRIPTION</CHILD>
<CINSTANCE>PQR</CINSTANCE>
<CPOS>0000</CPOS>
</XYZ>

    <XYZ>
<TYPE>GP</TYPE>
<INSTANCE>1472422</INSTANCE>
<CHILD>A</CHILD>
<CINSTANCE>1357599</CINSTANCE>
<CPOS>0010</CPOS>
</XYZ>

    <XYZ>
<TYPE>GP</TYPE>
<INSTANCE>1472427</INSTANCE>
<CHILD>A</CHILD>
<CINSTANCE>1357599</CINSTANCE>
<CPOS>0010</CPOS>
</XYZ>
    </Group>    

    <Group>
    <XYZ>
<TYPE>A</TYPE>
<INSTANCE>1357600</INSTANCE>
<CHILD>DESCRIPTION</CHILD>
<CINSTANCE>PQR</CINSTANCE>
<CPOS>0000</CPOS>
</XYZ>

    <XYZ>
<TYPE>GP</TYPE>
<INSTANCE>1472425</INSTANCE>
<CHILD>A</CHILD>
<CINSTANCE>1357600</CINSTANCE>
<CPOS>0010</CPOS>
</XYZ>

    <XYZ>
<TYPE>GP</TYPE>
<INSTANCE>1472426</INSTANCE>
<CHILD>A</CHILD>
<CINSTANCE>1357600</CINSTANCE>
<CPOS>0010</CPOS>
</XYZ>
    </Group>

我需要根据INSTANCE==CINSTANCE.. 对 XYZ 节点进行分组。无论如何要为此编写逻辑吗?

【问题讨论】:

  • linqpad.net Linqpad 在“示例”选项卡中提供了有关 linq to xml 的全套示例/教程。

标签: c# xml linq group-by


【解决方案1】:

您可能正在寻找类似以下代码的内容,但需要对您的格式进行细微更改,它需要 Xml 中的有效父元素。

    static void Main(string[] args)
    {
        string xml = @"<ELEMENTS><XYZ>     <TYPE>A</TYPE>     <INSTANCE>1357599</INSTANCE>     <CHILD>DESCRIPTION</CHILD>     <CINSTANCE>PQR</CINSTANCE>     <CPOS>0000</CPOS>     </XYZ>      <XYZ>     <TYPE>GP</TYPE>     <INSTANCE>1472422</INSTANCE>     <CHILD>A</CHILD>     <CINSTANCE>1357599</CINSTANCE>     <CPOS>0010</CPOS>     </XYZ>      <XYZ>     <TYPE>GP</TYPE>     <INSTANCE>1472427</INSTANCE>     <CHILD>A</CHILD>     <CINSTANCE>1357599</CINSTANCE>     <CPOS>0010</CPOS>     </XYZ>      <XYZ>     <TYPE>A</TYPE>     <INSTANCE>1357600</INSTANCE>     <CHILD>DESCRIPTION</CHILD>     <CINSTANCE>PQR</CINSTANCE>     <CPOS>0000</CPOS>     </XYZ>      <XYZ>     <TYPE>GP</TYPE>     <INSTANCE>1472425</INSTANCE>     <CHILD>A</CHILD>     <CINSTANCE>1357600</CINSTANCE>     <CPOS>0010</CPOS>     </XYZ>      <XYZ>     <TYPE>GP</TYPE>     <INSTANCE>1472426</INSTANCE>     <CHILD>A</CHILD>     <CINSTANCE>1357600</CINSTANCE>     <CPOS>0010</CPOS>     </XYZ></ELEMENTS>";
        Console.WriteLine(GetGroups(xml).ToString());
    }

    private static XDocument GetGroups(string xml)
    {
        XDocument xyzElementsDocument = XDocument.Parse(xml);

        var results = from xyzElement1 in xyzElementsDocument.Descendants("XYZ")
                      join xyzElement2 in xyzElementsDocument.Descendants("XYZ")
                      on (string)xyzElement1.Element("INSTANCE") equals (string)xyzElement2.Element("CINSTANCE") into joinedElements
                      from joinedElement in joinedElements.DefaultIfEmpty()
                      group xyzElement1 by joinedElement != null into groupedElements
                      select new { HasCInstance = groupedElements.Key, Elements = groupedElements.Distinct() };

        XDocument groupDocument = new XDocument();
        groupDocument.Add(new XElement("GROUPS"));
        foreach (var result in results)
        {
            XElement groupElement = new XElement("GROUP");
            groupElement.Add(result.Elements);
            groupDocument.Root.Add(groupElement);
        }

        return groupDocument;
    }

【讨论】:

  • @user1061293 这对你有用吗?您确实需要对您的问题发表评论或接受答案,否则最终人们将不愿回答您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2011-09-02
  • 1970-01-01
  • 2013-06-09
  • 2022-07-21
  • 1970-01-01
相关资源
最近更新 更多