2012-03-05 70 views
0

我有290个组策略备份XML文件,我需要在单独的文件夹中枚举。如何使用Linq动态查询名称空间到XML

对于每个组策略备份xml文件,我需要查询策略设置。

任何查看过组策略xml备份文件的人都会知道它们是充满命名空间声明的chock-block。

我想知道,使用Linq to XML,当我查询每个xml文件时,如何动态查询XML名称空间,然后将名称空间追加到子节点/值的Linq查询中?

下面是一些xml结构的例子。

<User> 
    <ExtensionData> 
     <Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/Scripts" xsi:type="q1:Scripts"> 
     <q1:Script> 


    <ExtensionData> 
     <Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/IE" xsi:type="q1:InternetExplorerSettings"> 
     <q1:PreferenceMode>true</q1:PreferenceMode> 


    <ExtensionData> 
     <Extension xmlns:q2="http://www.microsoft.com/GroupPolicy/Settings/Registry" xsi:type="q2:RegistrySettings"> 
     <q2:Policy> 
      <q2:Name>Disable changing accessibility settings</q2:Name> 
      <q2:State>Enabled</q2:State> 


    <ExtensionData> 
     <Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/DriveMaps" xsi:type="q1:DriveMapSettings"> 
     <q1:DriveMapSettings clsid="{8FDDCC1A-0C3C-43cd-A6B4-71A6DF20DA8C}"> 

我最初的代码如下所示:

Dim NS As XNamespace = "http://www.microsoft.com/GroupPolicy/Settings" 
NodeValue = XDoc.Descendants(NS + NodeName).First().Value 

正如你看到的,我要面对几十个字面上不同的命名空间,在这个阶段,我甚至不知道他们都是什么。

我的最终任务是浏览290个目录,每个目录包含一个组策略xml备份文件。然后我需要从备份文件中包含的每个设置中读取策略名称。

因为我不知道每个xml flie将包含什么策略设置,所以我不知道在尝试读取xml值时需要使用哪些名称空间。每个xml文件甚至可能包含多个名称空间。

如何动态读取Linq中的命名空间,以便我可以读取值?

谢谢

回答

0

这里是我结束了:

Dim ListOfNamespaces = z.Root.DescendantsAndSelf.Attributes().Where(Function(a) a.IsNamespaceDeclaration).GroupBy(Function(a) If(a.Name.[Namespace] = XNamespace.None, [String].Empty, a.Name.LocalName), Function(a) XNamespace.[Get](a.Value)).ToDictionary(Function(g) g.Key, Function(g) g.First()) 
0

你关心这些命名空间吗?即你是否区分它们并根据命名空间进行不同的处理?如果不这样做(例如你只是显示的东西),你可以做这样的事情:

XDoc.Descendants().Where(e => e.Name.LocalName == "Extension") 

这应该选择所有扩展元素而不考虑命名空间的。另外,如果你需要使用的命名空间,而不是一个硬编码查询元素,你可以做这样的事情:

foreach(XElement extensionElement in XDoc.Descendants().Where(e => e.Name.LocalName == "Extension") 
{ 
    var ns = extensionElement.Name.NamespaceName; 
    Console.WriteLine(extensionElement(ns + "DriveMapSettings")); 
} 
+0

哎,可惜是的,我关心的命名空间的XML结构,它们之间显著不同。 – Ben 2012-03-06 08:36:27

0

From e In XDoc.Descendants Group By e.Name.Namespace.NamespaceName,应找出所有不同的命名空间,但它是未经测试。