簡體   English   中英

如何使用Linq to XML動態查詢名稱空間

[英]How to query for namespace dynamically using Linq to XML

我有290個組策略備份xml文件,需要在單獨的文件夾中枚舉。

對於每個組策略備份xml文件,我需要查詢策略設置。

以前查看過組策略xml備份文件的任何人都將知道它們充滿了命名空間聲明。

我想知道,使用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中動態讀取命名空間,以便讀取值?

謝謝

您關心這些名稱空間嗎? 即您是否區分它們並根據namespace-uri做不同類型的處理? 如果您不這樣做(例如,您只顯示某些內容),則可以執行以下操作:

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"));
}

From e In XDoc.Descendants Group By e.Name.Namespace.NamespaceName可以找到所有不同的命名空間,但是未經測試。

我最終得到的是:

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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM