2016-11-09 22 views
0

私は、XMLデータファイルを持っている(下記参照)、CSVはそれからファイルを作成する必要があります。 XMLへのLINQを使用してクエリを書き始めて、私はList<SPSecurableObject>にデータをロードするが、今のようにあるべきであるCSVを書くために解決策を考えることができない。ネストされた再帰XML

ObjectName,PrincipalType,DisplayName,RoleDefBindings 
New Data,,, 
Documents,,, 
Documents2,User,John Doe,Limited Access 
Documents2,Group,Group1,Full Control 

XML:

<SPSecurableObject> 
    <ObjectName>New Data</ObjectName> 
    <ChildObjects> 
    <SPSecurableObject> 
     <ObjectName>Documents</ObjectName> 
    </SPSecurableObject> 
    <SPSecurableObject> 
     <ObjectName>Documents2</ObjectName> 
     <RoleAssignments> 
     <SPRoleAssignment> 
      <PrincipalType>User</PrincipalType> 
      <Member> 
      <User> 
       <DisplayName>John Doe</DisplayName> 
      </User> 
      </Member> 
      <RoleDefBindings> 
      <RoleName>Limited Access</RoleName> 
      </RoleDefBindings> 
     </SPRoleAssignment> 
     <SPRoleAssignment> 
      <PrincipalType>Group</PrincipalType> 
      <Member> 
      <Group> 
       <GroupName>Group1</GroupName> 
      </Group> 
      </Member> 
      <RoleDefBindings> 
      <RoleName>Full Control</RoleName> 
      </RoleDefBindings> 
     </SPRoleAssignment> 
     </RoleAssignments> 
    </SPSecurableObject> 
</ChildObjects> 
</SPSecurableObject>    

マイコードを形成しますList<SPSecurableObject>はこれです:

void Main() 
{ 
    var xml = XDocument.Load (@"C:\temp\data.xml"); 
    var root = xml.Elements("SPSecurableObject"); 
    List<SPSecurableObject> result = Load(root); 

} 

List<SPSecurableObject> Load(IEnumerable<XElement> xml) 
{ 
    return xml.Select(x=>new SPSecurableObject(){ 
         ObjectName = x.Elements("ObjectName").Select(y=>y.Value).FirstOrDefault(), 
         RoleAssignments=(from ra in x.Elements("RoleAssignments").Elements("SPRoleAssignment") 
        select new RoleAssignments{ 
         PrincipalType=ra.Elements("PrincipalType").Select(y=>y.Value).FirstOrDefault(), 
         DisplayName=ra.Elements("PrincipalType").Select(y=>y.Value).FirstOrDefault() == "Group" ? ra.Elements("Member").Elements("Group").Elements("GroupName").Select(y=>y.Value).FirstOrDefault() : ra.Elements("Member").Elements("User").Elements("DisplayName").Select(y=>y.Value).FirstOrDefault(), 
         RoleDefBindings = ra.Elements("RoleDefBindings").Elements("RoleName").Select(y=>y.Value).FirstOrDefault() 
        }).ToList(), 
        ChildObjects = Load(x.Elements("ChildObjects").Elements("SPSecurableObject")) 
}).ToList(); 
} 

おかげ

+0

CSVはフラットデータ用に設計されています。階層的なデータのフォーマットははるかに優れています。なぜあなたはこれをやっている? –

+0

単一のExcelシートのすべてのデータを参照するビジネス要件 –

答えて

-1

これを試してみてください:

var xml = XDocument.Load("data.xml"); 

var sb = new StringBuilder(); 

foreach (var node in xml.Descendants("SPSecurableObject")) 
{ 
    var objectName = node.Element("ObjectName").Value; 

    if (node.Element("RoleAssignments") == null) 
    { 
     sb.Append(objectName).AppendLine(",,,"); 
     continue; 
    } 

    var lines = node.Descendants("SPRoleAssignment") 
     .Select(elem => string.Join(",", elem.DescendantNodes().OfType<XText>())); 

    if (lines.Any()) 
    { 
     foreach (var line in lines) 
      sb.Append(objectName).Append(',').AppendLine(line); 
    } 
    else 
    { 
     sb.Append(objectName).AppendLine(",,,"); 
    } 
} 

Console.WriteLine(sb); 

これは、あなたが望む結果を提供します。

+0

答えに感謝します。私のフォーマットに何か変わったものがあるのはなぜですか?あなたは指摘できますか? –

+0

XMLファイルをご覧ください。ロジック –

+0

@pirmasnaujasが表示されます - 更新を参照してください。 –

関連する問題