我正在尝试从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);
有任何想法吗?
感谢。
答案 0 :(得分:15)
你真的想要使用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都有一个合适的布尔值,你可以使用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 ,尤其是。