использование XElement для запроса узла в пространстве имен

Я пытаюсь вытащить узел из файла csproj, который выглядит так, но не могу заставить его работать - предположительно из-за объявления пространства имен.

<?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);

Любые идеи, пожалуйста?

Спасибо.


person push 22    schedule 31.01.2011    source источник


Ответы (1)


Вы действительно хотите использовать для этого XPath? Использовать пространства имен в LINQ to 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 будет иметь соответствующее логическое значение, вы можете использовать явный XElement to bool конверсия:

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, особенно, если задействованы пространства имен.

person Jon Skeet    schedule 31.01.2011
comment
Я бы заменил последнюю строку на .Where(x => bool.Parse(x.Value)), так как мы на 100% ожидаем логическую строку (иначе мы ожидаем и исключение..). - person Shimmy Weitzhandler; 01.02.2011
comment
@Shimmy: я бы не использовал здесь bool.Parse - я бы использовал явное преобразование в bool, которое знает о XML. Будет редактировать. - person Jon Skeet; 01.02.2011