How should I create CSV out of List<SPSecurableObject>
where SPSecurableObject is recursive
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;}
}
I have XML data file (see below) and need to make CSV file out of it. Started writing query with Linq to XML and I load data into List<SPSecurableObject>
, but now cannot think of the solution to write CSV which should be like this:
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>
My Code to form List<SPSecurableObject>
is this:
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();
}
Thanks
Try this:
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);
This will give you the result you wanted.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.