2016-03-04 1 views
0

У меня есть эти элементы входа:Как я могу разделить элементы-братья внутри новых элементов на основе значения sibling в Xdocument?

<Entry> 
    <pos STYLE="NUM">1</pos > 
    <tran></tran> 
    <pos STYLE="NUM">2</pos > 
    <example></example> 
    <pos STYLE="NUM">3</pos > 
    <elem></elem> 
</Entry> 
<Entry> 
    ... 
</Entry> 

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

<Entry> 
    <body> 
    <tran></tran> 
    </body> 
    <body> 
    <example></example> 
    </body> 
    <body> 
    <elem></elem> 
    </body> 
</Entry> 

EDIT :: ГНФАР я загрузить XML документ перебирать все элементы и сделать некоторое форматирование, которое не имеет отношения к этому вопросу

XDocument doc = XDocument.Load(sourceDocument,LoadOptions.PreserveWhitespace); 
foreach (XElement rootElement in doc.Root.Elements()) 
{ 
    foreach (XElement childElement in rootElement.Descendants()) 
    { 
     //add new body if <pos style=num> 
     if (childElement.Attribute("STYLE") != null) 
     { 
      //if next node is NUM 
      var nextNode = childElement.XPathSelectElement("following-sibling::*"); 

      if (nextNode != null) 
      if (nextNode.Attribute("STYLE").Value == "NUM") 
      { 
       newBodyElem = new XElement("body"); 
      } 
} 
} 
+0

Где код? –

+0

@ HeinA.Grønnestad Вам нужен более подробный код? Я думаю, что это соответствующая часть –

+0

Teemu Eronen не было кода, когда я прокомментировал ... –

ответ

0

Это можно рассматривать как проблему группирования какой restructu res содержание элементов входа:

 XDocument doc = XDocument.Load("input.xml"); 
     foreach (XElement entry in doc.Descendants("Entry").ToList()) 
     { 
      foreach (var group in entry.Elements().Except(entry.Elements("pos")).GroupBy(child => child.ElementsBeforeSelf("pos").Last())) 
      { 
       group.Remove(); 
       group.Key.ReplaceWith(new XElement("body", group)); 
      } 
     } 
     doc.Save("output.xml");