我有一个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
答案 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