2012-02-28 81 views
0

如何計算擴展節點的名稱空間聲明的內容?使用Linq讀取名稱空間中的XML節點

我想回到所有的子節點下:GPO->用戶 - > ExtensionData->擴展

<?xml version="1.0" encoding="utf-16"?> 
<GPO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.microsoft.com/GroupPolicy/Settings"> 
    <User> 
    <VersionDirectory>4</VersionDirectory> 
    <VersionSysvol>4</VersionSysvol> 
    <Enabled>true</Enabled> 
    <ExtensionData> 
     <Extension xmlns:q1="http://www.microsoft.com/GroupPolicy/Settings/Scripts" xsi:type="q1:Scripts"> 
     <q1:Script> 
      <q1:Command>Logon.cmd</q1:Command> 
      <q1:Type>Logon</q1:Type> 
      <q1:Order>0</q1:Order> 
      <q1:RunOrder>PSNotConfigured</q1:RunOrder> 
     </q1:Script> 
     </Extension> 
     <Name>Scripts</Name> 
    </ExtensionData> 
    </User> 
    <LinksTo> 
    <SOMName>an interesting data value</SOMName> 
    <SOMPath>some data value</SOMPath> 
    <Enabled>true</Enabled> 
    <NoOverride>false</NoOverride> 
    </LinksTo> 
</GPO> 

這是我的嘗試:

Dim NS As XNamespace = "http://www.microsoft.com/GroupPolicy/Settings/Scripts" 
Dim UserPolCount = XDoc.Descendants(NS + "Extension").First() 

我得到以下錯誤:序列不包含任何元素

此外,我提供的XML示例只是一個小片段,ExtensionData-> Extension節點可以嵌套在不同的區域,所以我希望能找到方法指定完整路徑。

謝謝

回答

1

Extension元素仍然是根命名空間下:Extension

http://www.microsoft.com/GroupPolicy/Settings 

元素是腳本命名空間下:

http://www.microsoft.com/GroupPolicy/Settings/Scripts 

因此,你需要:

Dim NS As XNamespace = "http://www.microsoft.com/GroupPolicy/Settings/" 
Dim NS1 As XNamespace = "http://www.microsoft.com/GroupPolicy/Settings/Scipts" 
Dim UserPolCount = XDoc.Descendants(NS + "Extension").First() 
Dim ScriptNode = UserPolCount.Elements(NS1 + "Script") 

編輯從評論:

Dim extension = 
    XDoc 
    .Root 
    .Element(NS + "User") 
    .Element(NS + "ExtensionData") 
    .Element(NS + "Extension"); 
+0

謝謝你的例子。你能告訴我,我怎麼指定路徑:GPO->用戶 - >擴展數據 - >擴展,同樣GPO->計算機 - >擴展數據 - >擴展 – Ben 2012-02-28 10:53:33

+0

更新答案。 – DaveShaw 2012-02-28 11:27:52

1

您正在使用錯誤的命名空間。您需要使用http://www.microsoft.com/GroupPolicy/Settings作爲命名空間。
原因是隻有Extension的孩子在Scripts命名空間中。你可以很容易地看到:孩子們的前綴都是q1Extension本身不是。因此它在默認命名空間中定義,由根標籤GPO上的屬性xmlns="http://www.microsoft.com/GroupPolicy/Settings"定義。

+0

感謝您的信息,我會給它一個去。 – Ben 2012-02-28 10:52:30