2013-08-27 96 views
0

我有以下xml,我需要transfom到其他窗体。我有一个C#代码,但它有一个难以跟踪的错误。我相信Linq可以提供更容易出错的方式来做到这一点。 输入XML:用linq处理XML文档

<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> 

正如你所看到的,元素是角色ID,代码和描述组。

我创建了一个对象俗到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;} 

} 

的想法是再使用对象俗此列表重新创建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 to 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

谢谢马尔钦,我怎么能aplly这样只有独特的价值在级联ellement返回disticnt ? –

+0

对不起,我找到了。只是在选择上应用了一个独特的,非常感谢。 –