C# 嵌套的递归XML到CSV(使用Linq)

C# 嵌套的递归XML到CSV(使用Linq),c#,xml,linq,csv,recursion,C#,Xml,Linq,Csv,Recursion,我应该如何从SPSecurableObject递归的列表中创建CSV class SPSecurableObject { public string ObjectName {get;set;} public List<RoleAssignments> RoleAssignments {get;set;} public List<SPSecurableObject> ChildObjects {get;set;} } class RoleAssignments

我应该如何从SPSecurableObject递归的
列表中创建CSV

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:


新数据
文件
文件2
使用者
无名氏
有限访问
组
第一组
完全控制
我要形成列表的代码如下:

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();
}
void Main()
{
var xml=XDocument.Load(@“C:\temp\data.xml”);
var root=xml.Elements(“SPSecurableObject”);
列表结果=加载(根);
}
列表加载(IEnumerable xml)
{
返回xml.Select(x=>newSPSecurableObject(){
ObjectName=x.Elements(“ObjectName”)。选择(y=>y.Value)。FirstOrDefault(),
角色分配=(来自x.Elements(“角色分配”).Elements(“SPRoleAssignment”)中的ra)
选择新角色分配{
PrincipalType=ra.Elements(“PrincipalType”)。选择(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”)。选择(y=>y.Value)。FirstOrDefault()
}).ToList(),
ChildObjects=Load(x.Elements(“ChildObjects”).Elements(“SPSecurableObject”))
}).ToList();
}
谢谢

试试这个:

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);
var xml=XDocument.Load(“data.xml”); var sb=新的StringBuilder(); foreach(xml.subscriptions(“SPSecurableObject”)中的var节点) { var objectName=node.Element(“objectName”).Value; if(node.Element(“roleasignments”)==null) { sb.Append(objectName.AppendLine(“,”); 持续 } 变量行=节点子体(“SPRoleAssignment”) .Select(elem=>string.Join(“,”,elem.degenantNodes().OfType()); if(line.Any()) { foreach(行中的var行) sb.Append(objectName).Append(',').AppendLine(line); } 其他的 { sb.Append(objectName.AppendLine(“,”); } } (某人);

这会给你想要的结果。

谢谢你的回答。为什么我的格式包含一些奇怪的内容?您能指出吗?请查看XML文件。您将看到logicCSV是为平面数据设计的。分层数据有更好的格式。为什么要这样做?业务要求在单个excel表中查看所有数据
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();
}
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);