2012-02-28 122 views
0

我有什麼應該是一個相當簡單的要求。使用Linq讀取XML節點值

我想使用LINQ到XML在VS2010項目得到如下節點值:

GPO->名稱

GPO-> LinksTo-> SOMName

GPO-> LinksTo- > SOMPath

然後: 如果GPO->用戶 - > ExtensionDataCount節點存在,我想回到所有子節點的數量

同樣: 如果GPO->計算機> ExtensionData存在,所有子節點

這裏的返回數的XML,之前那些你熟悉組策略出口將看到這一點:

<?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"> 
    <Identifier> 
    <Domain xmlns="http://www.microsoft.com/GroupPolicy/Types">our.domain.fqdn</Domain> 
    </Identifier> 
    <Name>The Name I want to get</Name> 
    <Computer> 
    <VersionDirectory>1</VersionDirectory> 
    <VersionSysvol>1</VersionSysvol> 
    <Enabled>true</Enabled> 
    </Computer> 
    <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> 

我有加載XML文件到一個XDocument,然後試圖用拉名稱值:

XDoc.Elements("Name").FirstOrDefault.Value 
XDoc.Descendants("Name").First().Value 

但我發現了錯誤:未將對象引用設置到對象的實例,然後:序列不包含任何元素。

我猜我可能有錯誤的道路,但我認爲後人並不需要精確的路徑..

我要去哪裏錯了?

回答

2

你必須使用聲明命名空間:

XNamespace ns = "http://www.microsoft.com/GroupPolicy/Settings"; 
var firstName = xdoc.Descendants(ns + "Name").First().Value; 
+0

謝謝!以前沒有遇到過XNamespace。 – Ben 2012-02-28 05:03:15