Удалите дублированный элемент, а затем отсортируйте их с помощью Linq. - PullRequest
1 голос
/ 14 декабря 2009

У меня есть 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 ]

2 голосов
/ 14 декабря 2009

Ваш оператор 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 голосов
/ 14 декабря 2009

У меня есть другой способ решить эту проблему с помощью 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

0 голосов
/ 14 декабря 2009

Как это:

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, чтобы убедиться, что он сортируется правильно, если идентификатор больше 10, и вам нужно позвонить Select до Distinct, потому что XElement сравнивается по ссылке, что означает, что нет двух XElement равны, даже если они имеют одинаковое содержание. Вы можете написать свой собственный IEqualityComparer, но этот способ намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...