2011-01-31 3 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

Я бы заменил последнюю строку на '.Where (x => bool.Parse (x.Value))', так как мы на 100% ожидаем булевскую строку (иначе мы ожидаем и исключение ..). – Shimmy

+0

И для пакетных исполнений этот выбор стоит меньше накладных расходов. – Shimmy

+0

@Shimmy: Я бы не использовал bool.Parse здесь - я бы использовал явное преобразование в 'bool', который знает о XML. Будет редактировать. –

 Смежные вопросы

  • Нет связанных вопросов^_^