Sort XMLDocument usando linq
Não consigo entender como fazer isso. Existem vários outros exemplos aqui, mas nada realmente corresponde ao que eu quero fazer:
Considere o seguinte objeto XMLDocument:
<Policy>
<Covers>
<MyCover1>
<properties>
<sortOrder>1</sortOrder>
</properties>
</MyCover1>
<MyCover3>
<properties>
<sortOrder>3</sortOrder>
</properties>
</MyCover3>
<MyCover2>
<properties>
<sortOrder>2</sortOrder>
</properties>
</MyCover2>
</Covers>
</Policy>
Como eu classificaria este documento com base no nó "sortOrder" usando linQ ou outro métod
Depois da classificação, o outerxml deve ficar basicamente assim:
<Policy>
<Covers>
<MyCover1/>
<MyCover2/>
<MyCover3/>
</Covers>
</Policy>
ATUALIZA
Eu fiz alguns progressos, os dados agora estão classificados, mas como atualizo o XmlDocument original não classificado? Isto é o que eu tenho até agora:
private static void DoSort(XmlDocument policyDocument)
{
foreach(XmlNode coverGroup in policyDocument.SelectNodes("//CoverGroup"))
{
XDocument test = XDocument.Parse(coverGroup.OuterXml);
var sorted = from xe in test.Element("CoverGroup").Elements()
let so = xe.Element("properties").Element("displayOrder")
let num = (int)so
orderby num
select xe;
var result = new XElement("CoverGroup", sorted);
}
}
Preciso aplicar as alterações novamente em "policyDocument". Nota: Uma capa pode ter um CoverGroup próprio, que pode novamente ter Covers com CoverGroups próprios. Isso diminui pelo menos 4 níveis: ie
<Policy>
<Covers>
<MyCover1>
<properties>
<sortOrder></sortOrder>
</properties>
<CoverGroup>
<MyCover1Child>
<properties>
<sortOrder></sortOrder>
</properties>
</MyCover1Child>
</CoverGroup>
</MyCover1>
...
</Covers>
O XPATH e o foreach acima dos cateteres para a estrutura acima, então eu estava pensando em substituir o XmlNode coverGroup no primeiro foreach pela nova lista classificada, mas não sei como reconstruir um novo XmlNode. Se pudermos descobrir isso, podemos simplesmente fazer o seguinte:
policyDocument.ReplaceChild(coverGroup, mySortedXmlNode)