2013-08-27 2 views
0

У меня есть следующий xml, который мне нужно перевести в другую форму. У меня есть код C#, который делает это, но у него есть ошибка, с которой сложно отслеживать. Я верю, что Linq может предложить более склонный к ошибкам способ сделать это. ввод XML:манипулировать XML-документом с помощью linq

<NewDataSet> 
    <Table> 
    <RoleId>5</RoleId> 
    <Code>DP</Code> 
    <Description>Process data</Description> 
    <Task>Validate indices</Task> 
    <TaskId>12</TaskId> 
    <Country>BE</Country> 
    <CountryId>3</CountryId> 
    </Table> 
    <Table> 
    <RoleId>5</RoleId> 
    <Code>DP</Code> 
    <Description>Process data</Description> 
    <Task>calculate indices</Task> 
    <TaskId>11</TaskId> 
    <Country>US</Country> 
    <CountryId>4</CountryId> 
    </Table> 
    <Table> 
    <RoleId>5</RoleId> 
    <Code>DP</Code> 
    <Description>Process data</Description> 
    <Task>Calculate indices</Task> 
    <TaskId>11</TaskId> 
    <Country>UK</Country> 
    <CountryId>5</CountryId> 
    </Table> 
    <Table> 
    <RoleId>1</RoleId> 
    <Code>DR</Code> 
    <Description>View data</Description> 
    <Task>View Reports</Task> 
    <TaskId>9</TaskId> 
    <Country>SC</Country> 
    <CountryId>17</CountryId> 
    </Table> 
    <Table> 
    <RoleId>1</RoleId> 
    <Code>DR</Code> 
    <Description>View data</Description> 
    <Task>View Basics</Task> 
    <TaskId>10</TaskId> 
    <Country>SC</Country> 
    <CountryId>17</CountryId> 
    </Table> 
    <Table> 
    <RoleId>1</RoleId> 
    <Code>DR</Code> 
    <Description>View data</Description> 
    <Task>Download data</Task> 
    <TaskId>11</TaskId> 
    <Country>FR</Country> 
    <CountryId>15</CountryId> 
    </Table> 
</NewDataSet> 

и вывод, что мне нужно, это следующим образом:

<NewDataSet> 
<Table> 
    <RoleId>5</RoleId> 
    <Code>DP</Code> 
    <Description>Process data</Description> 
    <Task>Validate indices,Calculate indices,</Task> 
    <TaskId>12,11</TaskId> 
    <Country>BE,US,UK</Country> 
    <CountryId>3,4,5</CountryId> 
    </Table> 
    <Table> 
    <RoleId>1</RoleId> 
    <Code>DR</Code> 
    <Description>Process data from commercial fisheries</Description> 
    <Task>View Reports,View Basics,View data</Task> 
    <TaskId>9,10,11</TaskId> 
    <Country>SC,FR</Country> 
    <CountryId>17,15</CountryId> 
    </Table> 
</NewDataSet> 

Как вы можете видеть, элементы группируются по Идентификатор роли, код и описание.

Я создал объект custum проецировать элемент XML в

public class Table 
{ 
    public int RoleId {get;set;} 
    public string Code {get;set;} 
    public string Description {get;set;} 
    public string Task {get;set;} 
    public int TaskId {get;set;} 
    public string Country {get;set;} 
    public int CountryId {get;set;} 

} 

Идея заключается в том, чтобы затем использовать этот список объектов custum воссоздать документ XML. Но я думал, что может быть более простой путь. без необходимости использовать список объектов custum.

Остальная часть элемента просто конкатенирована. Надеюсь, у кого-то есть идея понять, как это можно достичь с помощью Linq to XML. большое спасибо заранее

+0

Вы определенно должны показать свои усилия здесь: код вы уже пробовали, и т.д. – MarcinJuraszek

ответ

1
var doc = XDocument.Load("Input.txt"); 

var tables = from t in doc.Root.Elements("Table") 
      select new Table 
      { 
       RoleId = (int)t.Element("RoleId"), 
       Code = (string)t.Element("Code"), 
       Description = (string)t.Element("Description"), 
       Task = (string)t.Element("Task"), 
       TaskId = (int)t.Element("TaskId"), 
       Country = (string)t.Element("Country"), 
       CountryId = (int)t.Element("CountryId") 
      }; 

var groups = tables.GroupBy(x => new { x.RoleId, x.Code, x.Description }); 

var resultDoc = new XDocument(
        new XElement("NewDataSet", 
         from g in groups 
         select new XElement("Table", 
            new XElement("RoleID", g.Key.RoleId), 
            new XElement("Code", g.Key.Code), 
            new XElement("Description", g.Key.Description), 
            new XElement("Task", string.Join(",", g.Select(x => x.Task))), 
            new XElement("TaskId", string.Join(",", g.Select(x => x.TaskId.ToString()))), 
            new XElement("Country", string.Join(",", g.Select(x => x.Country))), 
            new XElement("CountryId", string.Join(",", g.Select(x => x.CountryId.ToString())))))); 

Это полностью LINQ для решения XML, хотя вы должны рассмотреть вопрос об изменении разборе часть с XML-сериализации.

Результат XML:

<NewDataSet> 
    <Table> 
    <RoleID>5</RoleID> 
    <Code>DP</Code> 
    <Description>Process data</Description> 
    <Task>Validate indices,calculate indices,Calculate indices</Task> 
    <TaskId>12,11,11</TaskId> 
    <Country>BE,US,UK</Country> 
    <CountryId>3,4,5</CountryId> 
    </Table> 
    <Table> 
    <RoleID>1</RoleID> 
    <Code>Data Reader</Code> 
    <Description>View data</Description> 
    <Task>View Reports,View Basics,Download data</Task> 
    <TaskId>9,10,11</TaskId> 
    <Country>SC,SC,FR</Country> 
    <CountryId>17,17,15</CountryId> 
    </Table> 
</NewDataSet> 
+0

Благодаря Marcin, как я могу aplly disticnt так, что только уникальное значение возвращается в каскадной ellement ? –

+0

Извините, я нашел его. Просто применил отличный выбор на Select Again, большое спасибо. –

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