删除重复元素,然后使用Linq对它们进行排序

时间:2009-12-14 15:46:30

标签: xml linq

我有一个XML文件:

  <School>
    <SchoolID>9</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>4</SchoolID>
    <SchoolID>1</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>9</SchoolID>
    <SchoolID>2</SchoolID>
  </School>

期待的结果应该是:

 <School>
    <SchoolID>1</SchoolID>
    <SchoolID>2</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>4</SchoolID>
    <SchoolID>9</SchoolID>
 </School>

我的C#代码:

var xdoc = XElement.Load(filePath + "input.xml");
var temp = xdoc.Descendants("SchoolID").OrderBy(x => x.Value).Distinct();
xdoc.Save(filePath + "output_final.xml");

但是,结果不会改变任何东西。

我的临时值是我想要的,如何更新输出xml结果?

非常感谢。

DY

3 个答案:

答案 0 :(得分:2)

您的LINQ语句只创建一个可以在以后执行的语句,它不会修改任何内容。以下内容很快解决了这个问题:

var xdoc = XDocument.Load(filePath + "input.xml");
xdoc.Root.ReplaceAll(xdoc
    .Descendants("SchoolID")
    .DistinctBy(e => e.Value)
    .OrderBy(e => e.Value));
xdoc.Save(filePath + "output_final.xml");

答案 1 :(得分:0)

像这样:

var ids = xdoc.Descendants("SchoolID")
              .Select(x => int.Parse(x.Value))
              .Distinct()
              .OrderBy(x => x);

var newDoc = new XElement("School", ids.Select(i => new XElement("SchoolID", i));
newDoc.Save(filePath + "output_final.xml");

如果ID超过10,您需要致电int.Parse以确保其排序正确,并且您需要在Select之前致电Distinct,因为XElement已被比较通过引用,意味着没有两个XElement s相等,即使它们具有相同的内容。您可以编写自己的IEqualityComparer,但这种方式更容易。

答案 2 :(得分:0)

我有另一种方法可以使用XSLT来解决这个问题。

<xsl:template match="SchoolID">
<xsl:if test="not(node()) or not(preceding-sibling::node()[.=string(current())])">
<SchoolID>
   <xsl:value-of select="SchoolID"/>
</SchoolID>
</xsl:if>   
</xsl:template>

此代码不包括排序。

感谢。

DY