2014-10-30 159 views
0

我有读取XML文件的要求。我从来没有用XML做过任何事情,所以对我来说这是全新的领域。请参阅下面的XML示例。检索未知数量的XML属性

- 
<GPO xmlns="http://www.microsoft.com/GroupPolicy/Settings" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+ 
    <Identifier> 
    <Name>GB Local Server Access</Name> 
    <IncludeComments>true</IncludeComments> 
    <CreatedTime>2011-08-03T11:58:18</CreatedTime> 
    <ModifiedTime>2011-08-03T12:13:41</ModifiedTime> 
    <ReadTime>2014-10-21T11:32:49.5863908Z</ReadTime>+ 
    <SecurityDescriptor>---------------------------- 
     <FilterDataAvailable>true</FilterDataAvailable>- 
     <Computer> 
     <VersionDirectory>18</VersionDirectory> 
     <VersionSysvol>18</VersionSysvol> 
     <Enabled>true</Enabled>- 
     <ExtensionData>- 
      <Extension xsi:type="q1:SecuritySettings" xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/Security">- 
      <q1:RestrictedGroups>- 
       <q1:GroupName> 
       <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-21-1547161642-1214440339-682003330-1141792</SID> 
       <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">CRB\DKCPHGITSCOM</Name> 
       </q1:GroupName>- 
       <q1:Memberof> 
       <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-32-544</SID> 
       <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">BUILTIN\Administrators</Name> 
       </q1:Memberof> 
      </q1:RestrictedGroups>- 
      <q1:RestrictedGroups>- 
       <q1:GroupName> 
       <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-21-1547161642-1214440339-682003330-1151</SID> 
       <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">CRB\GB Administrators</Name> 
       </q1:GroupName>- 
       <q1:Memberof> 
       <SID xmlns="http://www.microsoft.com/GroupPolicy/Types">S-1-5-32-544</SID> 
       <Name xmlns="http://www.microsoft.com/GroupPolicy/Types">BUILTIN\Administrators</Name> 
       </q1:Memberof> 
      </q1:RestrictedGroups> 

能不能请您指教的最简单的方法,我可以使用,这将让我深入到GPO.Computer.ExtensionData.Extension.RestrictedGroups然后RestrictedGroups回报每实例值为GroupName.Name和MemberOf.Name。然后,我可以将逻辑合并到一个可以输出的数组中。

回答

0

您应该使用LINQ to XML。

喜欢的东西:

//preparing the reusable XName instances: 
var q1Namespace = "http://www.microsoft.com/GroupPolicy/Settings/Security"; 

var groupNameElementName = XName.Get("GroupName", q1Namespace); 
var memberOfElementName = XName.Get("Memberof", q1Namespace); 

var nameElementName = XName.Get("Name", "http://www.microsoft.com/GroupPolicy/Types"); 

var data = XDocument.Load(filePath) 
    .Descendants(XName.Get("RestrictedGroups", q1Namespace)) 
    .Select(group => 
     new 
     { 
      GroupName = 
       group.Descendants(groupNameElementName) 
        .Select(gn => gn.Element(nameElementName).Value) 
        .FirstOrDefault(), 

      MemberOfName = 
       group.Descendants(memberOfElementName) 
        .Select(gn => gn.Element(nameElementName).Value) 
        .FirstOrDefault() 
     }); 

然后在foreach循环使用它:

foreach (var d in data) 
{ 
    Console.WriteLine("Group name: {0}, member of name: {1}", d.GroupName, d.MemberOfName); 
} 

如果你想使之安全,并为名称提供默认值,使用类似以下而不是Select呼叫找到名称元素:

... 
    .SelectMany(gn => gn.Elements(nameElementName)) 
    .Select(elem => elem.Value ?? "Name not found") 
    .DefaultIfEmpty("Name not found") 
    .FirstOrDefault() 

这样您就可以保护自己免受名称元素不存在或无价值的情况。

+0

你可以举个例子,我可以如何使用它,可以说我想通过列表作为每个循环的一部分。 – NadimAJ 2014-10-30 13:24:45

+0

完成后,您可以立即看到使用情况。 – galenus 2014-10-30 13:49:52

+0

谢谢,但上述不生成任何数据。 var数据是空的(foreach循环立即退出)。 XML包含相当深的结构,我可以请你再次检查元素/后代吗? – NadimAJ 2014-11-04 16:48:32