2016-11-09 69 views
0

我应该如何创建CSV出List<SPSecurableObject>其中SPSecurableObject是递归嵌套递归XML为CSV(使用LINQ)

class SPSecurableObject 
{ 
    public string ObjectName {get;set;} 
    public List<RoleAssignments> RoleAssignments {get;set;} 
    public List<SPSecurableObject> ChildObjects {get;set;} 
} 
class RoleAssignments 
{ 
    public string PrincipalType {get;set;} 
    public string DisplayName {get;set;} 
    public string RoleDefBindings {get;set;} 
} 

我有XML数据文件(见下文),并需要作出CSV文件出来。使用LINQ开始写查询XML和我加载数据到List<SPSecurableObject>,但现在还不能认为解决的办法写CSV应该是这样的:

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 - 看到更新。 –