C# 如何在C.net中使用LINQ对XML数据进行分组?
我想使用C.net读取一个xml文件,在LINQ的帮助下,我想根据实例和实例值对xml中的节点进行分组。我该怎么做? 这是我的源架构:C# 如何在C.net中使用LINQ对XML数据进行分组?,c#,xml,linq,group-by,C#,Xml,Linq,Group By,我想使用C.net读取一个xml文件,在LINQ的帮助下,我想根据实例和实例值对xml中的节点进行分组。我该怎么做? 这是我的源架构: <XYZ> <TYPE>A</TYPE> <INSTANCE>1357599</INSTANCE> <CHILD>DESCRIPTION</CHILD> <CINSTANCE>PQR</CINSTANCE> <
<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节点进行分组。是否还要为此编写逻辑?您可能正在寻找类似以下代码的内容,但需要对格式进行细微更改,它需要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;
}
Linqpad在“示例”选项卡中有一整套关于linq到xml的示例/教程。@user1061293这对您有用吗?你真的需要对你的问题发表评论或接受答案,否则最终人们会不愿意回答你。