[英]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.