2015-06-10 8 views
0

У меня есть XML и я хочу, чтобы узел «action» находился в отсортированном порядке на основе значения атрибута «нет».Сортировка XML-документа на основе grandchild

<game gamecode="10065904"> 
    <general> 
     <startdate>2015-06-10 07:59:04</startdate> 
     <players> 
     <player seat="1" name="player1" chips="2,937" dealer="1" win="0" bet="20" rebuy="0" addon="0" reg_code="-" /> 
     <player seat="3" name="ponda22c" chips="780" dealer="0" win="0" bet="0" rebuy="0" addon="0" reg_code="-" /> 
     <player seat="5" name="Mesut1Rebel" chips="0" dealer="0" win="0" bet="0" rebuy="0" addon="0" reg_code="-" /> 
     <player seat="6" name="player4" chips="10,746" dealer="0" win="0" bet="420" rebuy="0" addon="0" reg_code="-" /> 
     <player seat="8" name="player5" chips="3,670" dealer="0" win="0" bet="420" rebuy="0" addon="0" reg_code="-" /> 
     <player seat="10" name="player6" chips="5,143" dealer="0" win="2,558" bet="1,700" rebuy="0" addon="0" reg_code="-" /> 
     </players> 
    </general> 
    <round no="0"> 
     <action no="1" player="player4" type="1" sum="10" cards="[cards]" /> 
     <action no="2" player="player5" type="2" sum="20" cards="[cards]" /> 
    </round> 
    <round no="1"> 
     <cards type="Pocket" player="player1">X X</cards> 
     <action no="4" player="player1" type="3" sum="20" cards="" /> 
     <cards type="Pocket" player="player4">X X</cards> 
     <action no="5" player="player4" type="3" sum="10" cards="" /> 
     <cards type="Pocket" player="player5">X X</cards> 
     <action no="6" player="player5" type="4" sum="0" cards="" /> 
     <cards type="Pocket" player="player6">X X</cards> 
     <action no="3" player="player6" type="3" sum="20" cards="" /> 
    </round> 
    <round no="2"> 
     <cards type="Flop" player="">H4 CQ C8</cards> 
     <action no="10" player="player1" type="0" sum="0" cards="" /> 
     <action no="7" player="player4" type="4" sum="0" cards="" /> 
     <action no="11" player="player4" type="3" sum="80" cards="" /> 
     <action no="8" player="player5" type="4" sum="0" cards="" /> 
     <action no="12" player="player5" type="3" sum="80" cards="" /> 
     <action no="9" player="player6" type="5" sum="80" cards="" /> 
    </round> 
    <round no="3"> 
     <cards type="Turn" player="">H9</cards> 
     <action no="13" player="player4" type="4" sum="0" cards="" /> 
     <action no="16" player="player4" type="3" sum="320" cards="" /> 
     <action no="14" player="player5" type="4" sum="0" cards="" /> 
     <action no="17" player="player5" type="3" sum="320" cards="" /> 
     <action no="15" player="player6" type="5" sum="320" cards="" /> 
    </round> 
    <round no="4"> 
     <cards type="River" player="">HJ</cards> 
     <action no="18" player="player4" type="4" sum="0" cards="" /> 
     <action no="21" player="player4" type="0" sum="0" cards="" /> 
     <action no="19" player="player5" type="4" sum="0" cards="" /> 
     <action no="22" player="player5" type="0" sum="0" cards="" /> 
     <action no="20" player="player6" type="5" sum="1,280" cards="" /> 
    </round> 
</game> 

Например, в раунде нет = 2, узлы действия не в последовательности, действие № 7 не является первым ребенком, его второй там. Я хочу, чтобы это было первым. Так круглый нет моего отсортированного документа = 2 должен выглядеть следующим образом:

<round no="2"> 
    <cards type="Flop" player="">H4 CQ C8</cards> 
    <action no="7" player="player4" type="4" sum="0" cards="" /> 
    <action no="8" player="player5" type="4" sum="0" cards="" /> 
    <action no="9" player="player6" type="5" sum="80" cards="" /> 
    <action no="10" player="player1" type="0" sum="0" cards="" /> 
    <action no="11" player="player4" type="3" sum="80" cards="" /> 
    <action no="12" player="player5" type="3" sum="80" cards="" /> 
</round> 

Как я могу сделать это с помощью LINQ или каким-либо другим простым способом. Обратите внимание, что после сортировки только узлы действия будут меняться, остальные узлы останутся в одном месте.

+0

Это помогло бы, если бы вы могли уменьшить свой образец XML до более управляемого размера - достаточно, чтобы воспроизвести проблему, но не более того, а также отступы, соответственно, но * без * посторонних символов '-', которые предположительно исходят из ваш браузер. –

+0

«быть в отсортированном порядке» - как и где именно? Вы хотите отсортировать XML на месте или при извлечении списка действий? –

+0

Что происходит в случае, когда элементы 'cards' перемежаются на всем протяжении? Например, как бы вы сортировали раунд 1? –

ответ

0

Как вы говорите, что вы не возражаете, если действия сгруппированы после карты, вы можете разобрать это с помощью LINQ к XML и удалить все элементы действий и добавить их в конце в отсортированном порядке:

var doc = XDocument.Parse(xml); 

foreach (var round in doc.Descendants("round")) 
{ 
    var sortedActions = round.Elements("action") 
     .OrderBy(e => (int)e.Attribute("no")) 
     .ToList(); 

    sortedActions.Remove(); 
    round.Add(sortedActions); 
} 

Если вы уже разборе XML в коде, как вы подразумеваете, вы можете просто сортировать их, читая каждый раунд.

1

Это должно сортировать секцию действия xml по своему желанию. Удаление в пределах Select() необходимо для отключения текущих неупорядоченных действий от родителя. Как только это будет сделано, мы добавим упорядоченное действие обратно.

static void Main() 
{ 
    var root = XElement.Parse(xmlToParse); 

    var orderedRoundElements= root.Elements("round") 
           .Select(element=>{ 
               var actions = element.Elements("action") 
                    .OrderBy(elem=> (int)elem.Attribute("no")) 
                    .ToList(); 
               actions.Remove(); 
               element.Add(actions); 
               return element; 
            }).ToList(); 

     Console.WriteLine(root.ToString()); 
} 
+0

Это также дает те же результаты, но второе решение выглядит просто. –

Смежные вопросы