我怎么能在xml文件中做一个我得到属性值的循环?

时间:2014-05-22 06:58:45

标签: c# asp.net xml linq loops

您好我有一个xml文件和一个来自Active Directory的字符串...我想用xml文件中的值检查字符串。

这里是xml: Permissiongroups.xml

<Permissiongroup>
  <Permission canonicalname="OU=dbg,OU=de,OU=zzz,DC=company_test,DC=com" display="group" />
  <Permission canonicalname="OU=brv,OU=de,OU=zzz,DC=company_test,DC=com" display="group" />
  <Permission canonicalname="OU=EK,OU=brv,OU=de,OU=zzz,DC=company_test,DC=com" display="group" />
</Permissiongroup>

我的C#代码:

string canonicalname = user.canoncialName; //here I get the canonicalname of the search user 

//例如在这里&#34; CN = Tarasov \,W,OU = PRG,OU = IT,OU = dbg,OU = de,OU = zzz,DC =公司,DC = com& #34;

string path = Server.MapPath("~/App_Data/Permissiongroups.xml"); // Get XML Path
string group = GetGroup(path, canonicalname); // Get User that match with canonicalname

这是我的方法:

private string GetGroup(string xml, string canonicalname) 
{
   XDocument document;
   XElement element;

   try
   {
     document = XDocument.Load(xml);

     //check every attribute canonicalname in the xml with the string canonicalname

     //return display value from the element with attributte canonicalname = canonicalname

   }
   catch (Exception)
   {
    return null;
   }
   finally 
   {
    document = null;
    element = null;
   }

 }

现在是我的问题我如何在xml中创建一个循环,给我一个属性canoicalname值。我需要用另一个字符串检查它。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

var permissions = document.Descendants("Permission");

foreach (var p in permissions)
{
    Console.WriteLine(p.Attribute("canonicalname").Value);
}

这只是一个如何打印这些值的示例,但我认为您将完成其余的工作,因为我不知道这些检查要求是什么。

如果您想找到与Permission匹配的canonicalname,可以尝试以下代码:

var searchedPermission = permissions.FirstOrDefault(p => p.Attribute("canonicalname").Value == canonicalname);

答案 1 :(得分:1)

您可以使用LINQ to XML方法。首先使用字符串canonicalname:

在xml中查找所有属性canonicalname
var q = (from c in doc.Descendants("Permission")
        where string.Equals(c.Attribute("canonicalname").Value, canonicalname)
        select c).ToList();

然后显示值:

foreach (var item in q)
{
    Console.WriteLine(item.Attribute("canonicalname").Value);
}