2012-02-28 124 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