2009-06-24 2 views
0

У меня есть документ xml, который я создаю, используя цикл ниже и XML-writer из C#. В настоящее время он работает отлично, но я хотел бы реализовать решение, где каждый раз, когда XML написан, он автоматически сортирует его по возрастанию, используя поле driveStart. Я знаю, что люди говорят, что вы должны сделать это в XSLT, но мне сложно найти хороший пример для подражания. У кого-нибудь есть опыт в этом, который я могу использовать? Любая помощь очень признательна.Сортировка XML с C# перед записью

XmlDocument doc = new XmlDocument(); 
XmlElement rn = doc.CreateElement("DriveLayout"); 
XmlElement dn = null; 
XmlAttribute xa, xa1, xa2, xa3, xa4, xa5, xa6; 
doc.AppendChild(rn); 

foreach (GridItem item in this.fileSystemGrid.Items) 
{ 
    dn = doc.CreateElement("Drive"); 
    xa = doc.CreateAttribute("driveTime"); 
    xa.Value = item["DriveTime"].ToString(); 
    xa1 = doc.CreateAttribute("driveStart"); 
    xa1.Value = item["DriveStart"].ToString(); 
    xa2 = doc.CreateAttribute("driveEnd"); 
    xa2.Value = item["DriveEnd"].ToString(); 
} 

dn.SetAttributeNode(xa); 
dn.SetAttributeNode(xa1); 
dn.SetAttributeNode(xa2); 
rn.AppendChild(dn); 

return doc.InnerXml; 

ответ

3

Отсортируйте свою коллекцию с помощью DriveStart перед использованием создателя xml.

+0

жаль, что я новичок в C#. Так что что-то по строкам item.Sort = ??? – Splashlin

+0

Скорее всего, вам стоит поговорить с более старшими разработчиками вашей команды об этом. Среди прочего, для вас немного странно брать данные из самой сетки, вместо того, чтобы брать данные из того, с чем привязана сетка. Следующий вопрос будет той версией Visual Studio, которую вы используете. –

+0

Я не могу найти, как сортировать коллекцию сетки. Я вижу, как делать gridview и другие, но не весь gridcollection – Splashlin

0

Почему вы хотите его отсортировать? Как он будет использоваться? Обычно XML - это всего лишь данные, и он не сортируется, чтобы заставить его выглядеть красиво.

+0

xml позже разбирается для использования другой программой. Проблема в том, что при выполнении этой конкретной программы она должна идти от минимального к самому большому. Таким образом, я хочу отсортировать XML до того, как он будет написан так, чтобы другая программа могла правильно выполнить свою работу. – Splashlin

+0

Тогда это действительно работа другой программы. В противном случае, если он изменит свои требования (возможно, для сортировки на DriveEnd в дополнение к DriveStart), ваш код придется изменить. В вашем коде не должно быть знаний о том, как другая программа хочет сортировать данные. –

1

Интересно, почему вы не строите свой XML в отсортированной форме с самого начала. Это будет проще и эффективнее, тем более, что вы, похоже, новичок в XSL.

Во всяком случае, для удовольствия от него — предполагается, что ваш XML выглядит следующим образом:

<DriveLayout> 
    <Drive driveTime="somevalue" driveStart="somevalue" driveEnd="somevalue" /> 
    <Drive driveTime="somevalue" driveStart="somevalue" driveEnd="somevalue" /> 
    <Drive driveTime="somevalue" driveStart="somevalue" driveEnd="somevalue" /> 
</DriveLayout> 

Тогда сортировка будет принимать это XSLT 1.0 таблицы стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="DriveLayout"> 
    <xsl:copy> 
     <xsl:apply-templates select="Drive"> 
     <xsl:sort select="@driveTime" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Drive"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

В .NET вы бы использовать XslCompiledTransform чтобы внести изменения в документ. На связанной странице MSDN есть достаточно материала, чтобы вы начали.