2011-01-31 12 views
5

我試圖拔出從文件的csproj看起來像這樣的一個節點一個節點,但無法得到它的工作 - 這大概是因爲該命名空間聲明。使用的XElement查詢在命名空間

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build"> 
     <PropertyGroup> 
      <RegisterForComInterop>true</RegisterForComInterop> 

這悲慘的失敗了:

XDocument cpo = XDocument.Load(file); 
XmlNamespaceManager nsm = new XmlNamespaceManager(new NameTable()); 
nsm.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/200"); 
IEnumerable<XElement> list3 = cpo.XPathSelectElements("//x:RegisterForComInterop[.='true']", nsm); 

任何人任何想法嗎?

謝謝。

回答

12

你真的想使用XPath這個?這真的很容易內LINQ使用命名空間XML:

XDocument cpo = XDocument.Load(file); 
XNamespace x = "http://schemas.microsoft.com/developer/msbuild/2003"; 
var elements = cpo.Descendants(x + "RegisterForComInterop") 
        .Where(x => (string) x == "true"); 

,或者如果你是絕對相信,每一個RegisterForComInterop具有適當的布爾值,你可以使用explicit XElement to bool conversion

XDocument cpo = XDocument.Load(file); 
XNamespace x = "http://schemas.microsoft.com/developer/msbuild/2003"; 
var elements = cpo.Descendants(x + "RegisterForComInterop") 
        .Where(x => (bool) x); 

我個人通常走這條路線而不是XPath ,尤其是,如果涉及名稱空間的話。

+0

我會替換最後一行'。凡(X => bool.Parse(x.Value))`因爲我們是100%,期待一個布爾值的字符串(否則我們期待和異常..)。 – Shimmy 2011-01-31 23:25:04