0

他のフォームに変換する必要がある次の xml があります。私はそれを行う C# コードを持っていますが、追跡が難しいバグがあります。私は、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>

ご覧のとおり、要素は RoleId、Code、および Description によってグループ化されています。

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 ドキュメントを再作成するという考え方です。しかし、私はもっと簡単な方法があるかもしれないと考えていました。カスタム オブジェクト リストを使用する必要はありません。

残りの要素は単純に連結されます。Linq to XML を使用してこれを実現する方法について、誰かがアイデアを提案してくれることを願っています。よろしくお願いします

4

1 に答える 1

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()))))));

XML Serialization を使用して解析部分を変更することを検討する必要がありますが、これは完全に LINQ to 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>
于 2013-08-27T10:16:55.590 に答える