检索未知数量的XML属性

时间:2014-10-30 09:19:26

标签: c# 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 然后 FOR EACH RestrictedGroups 的实例返回 GroupName.Name和MemberOf.Name 的值。然后我可以合并逻辑,将这些数据放入一个可以输出的数组中。

1 个答案:

答案 0 :(得分: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调用:< / p>

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

这样您就可以保护自己免受 Name 元素不存在或没有价值的情况的影响。