2014-10-30 6 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 (var d in data) 
{ 
    Console.WriteLine("Group name: {0}, member of name: {1}", d.GroupName, d.MemberOfName); 
} 

Если вы хотите, чтобы сделать его безопасным и значения по умолчанию для имен, использовать что-то вроде ниже вместо Select вызова, который находит Name элемент:

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

Таким образом, вы защитите себя от случаев, когда Элемент не существует или не имеет значения.

+0

Не могли бы вы привести пример, как я мог бы использовать это, скажем, я хочу, чтобы iterrate через список был частью a для каждого цикла. – NadimAJ

+0

Выполнено, теперь вы можете увидеть использование. – galenus

+0

Спасибо, однако выше не генерирует никаких данных. Данные var пусты (сразу же выходят петли foreach). XML содержит довольно глубокую структуру, я могу попросить вас еще раз проверить элементы/потомки? – NadimAJ

Смежные вопросы