简体   繁体   中英

nested recursive XML to CSV (using Linq)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM