использование XElement для запроса узла в пространстве имен - PullRequest
7 голосов
/ 01 февраля 2011

Я пытаюсь извлечь узел из файла 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);

Кто-нибудь есть идеи, пожалуйста?

Спасибо.

1 Ответ

15 голосов
/ 01 февраля 2011

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

...