Как динамически запрашивать пространство имен, используя Linq to XML - PullRequest
0 голосов
/ 05 марта 2012

У меня есть 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, я не знаю, какие пространства именМне нужно использовать при попытке прочитать значения XML.Каждый xml-файл может даже содержать несколько пространств имен.

Как динамически читать пространство имен в Linq, чтобы я мог читать значения?

Спасибо

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

From e In XDoc.Descendants Group By e.Name.Namespace.NamespaceName должен найти все отдельные пространства имен, но это не проверено.

0 голосов
/ 06 марта 2012

Вот что у меня получилось:

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 голосов
/ 06 марта 2012

Вам небезразличны эти пространства имен?т.е. вы различаете их и выполняете разные виды обработки в зависимости от пространства имен-uri?Если вы этого не сделаете (например, просто отображаете что-то), вы можете сделать что-то вроде этого:

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

Это должно выбрать все элементы Extension независимо от пространства имен.В качестве альтернативы, если вам нужно запрашивать элементы, используя пространства имен вместо жесткого, вы можете сделать что-то вроде этого:

foreach(XElement extensionElement in XDoc.Descendants().Where(e => e.Name.LocalName == "Extension")
{
   var ns = extensionElement.Name.NamespaceName;
   Console.WriteLine(extensionElement(ns + "DriveMapSettings"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...