2012-03-05 69 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,應找出所有不同的命名空間,但它是未經測試。