2009-12-14 69 views
1

对它们进行排序我有一个XML文件:取出duplcated元素,然后使用LINQ

<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

+0

您应该接受您的问题的答案,方法是单击每个问题的最喜欢答案旁边的空白检查。这样做会给你更多的声誉。 – SLaks 2009-12-14 18:18:13

回答

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"); 
+0

嗨尤里,非常感谢。 有没有简单的方法可以让xml文件更新? – 2009-12-14 15:50:10

+0

在此工作。 – 2009-12-14 15:51:22

+0

没有'DistinctBy'方法。 – SLaks 2009-12-14 16:26:43

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"); 

你定义调用int.Parse以确保正确排序如果ID超过10,你需要Distinct之前调用Select因为XElement通过参考进行比较,这意味着即使它们具有相同的内容,也不会有任何两个XElement相等。你可以写自己的IEqualityComparer,但这种方式要容易得多。

+1

也许会颠倒Distinct和OrderBy? – 2009-12-14 15:55:29

+0

非常好的主意。 – SLaks 2009-12-14 15:56:46

+0

感谢Intellisense,我找到了DistinctBy。 – 2009-12-14 16:08:42

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

相关问题