我正在此xml 上尝试一个非常基本的XPath(与下面相同),但它没有找到任何东西 我正在尝试.NET和这个网站,以及 // PropertyGroup等XPath / PropertyGroup // MSBuildCommunityTasksPath 根本不适合我(他们编译但返回零结果)。

源XML:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- $Id: FxCop.proj 114 2006-03-14 06:32:46Z pwelter34 $ -->
    <PropertyGroup>
        <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
    </PropertyGroup>
    <Import
        Project="$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets" />
    <Target Name="DoFxCop">
        <FxCop TargetAssemblies="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll"
            RuleLibraries="@(FxCopRuleAssemblies)" 
            AnalysisReportFileName="Test.html"
            DependencyDirectories="$(MSBuildCommunityTasksPath)" 
            FailOnError="True"
            ApplyOutXsl="True"
            OutputXslFileName="C:\Program Files\Microsoft FxCop 1.32\Xml\FxCopReport.xsl" />
    </Target>
</Project>
有帮助吗?

解决方案

您可以在代码中添加名称空间以及所有这些名称空间,但您可以有效地对命名空间进行通配符。尝试以下XPath习惯用法。

//*[local-name()='PropertyGroup']
//*[local-name()='MSBuildCommunityTasksPath']

name()通常也可以,如:

//*[name()='PropertyGroup']
//*[name()='MSBuildCommunityTasksPath']

编辑:命名空间很棒,我并不是说它们不重要,但是在将原型代码,一次性桌面工具,XSLT试验,以及XSLT拼凑在一起时,通配它们会派上用场。等等。平衡您的方便需求与手头任务的可接受风险。仅供参考,如果需要,您还可以剥离或重新分配名称空间。

其他提示

文档中的标签最终以“默认”标签结束。由xmlns属性创建的名称空间,没有前缀。不幸的是,单独的XPath无法查询默认命名空间中的元素。我实际上不确定语义细节,但你必须使用任何托管XPath的工具显式地将前缀附加到该命名空间。

在.NET中可能有一种更短的方法,但我见过的唯一方法是通过NameSpaceManager。显式添加命名空间后,您可以使用命名空间管理器进行查询,就好像命名空间元素中的所有标记都具有该前缀(我选择'msbuild'):

using System;
using System.Xml;

public class XPathNamespace {
    public static void Main(string[] args) {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(
    @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
    <!-- $Id: FxCop.proj 114 2006-03-14 06:32:46Z pwelter34 $ -->

    <PropertyGroup>
        <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
    </PropertyGroup>

    <Import Project=""$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets""/>

    <Target Name=""DoFxCop"">

        <FxCop 
            TargetAssemblies=""$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll""
            RuleLibraries=""@(FxCopRuleAssemblies)"" 
            AnalysisReportFileName=""Test.html""
            DependencyDirectories=""$(MSBuildCommunityTasksPath)""
            FailOnError=""True""
            ApplyOutXsl=""True""
            OutputXslFileName=""C:\Program Files\Microsoft FxCop 1.32\Xml\FxCopReport.xsl""
        />
    </Target>

</Project>");

        XmlNamespaceManager namespaceManager = new
    XmlNamespaceManager(xmlDocument.NameTable);
        namespaceManager.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
        foreach (XmlNode n in xmlDocument.SelectNodes("//msbuild:MSBuildCommunityTasksPath", namespaceManager)) {
            Console.WriteLine(n.InnerText);
        }
    }
}

您的问题在于命名空间(xmlns =&quot; http://schemas.microsoft.com/developer/msbuild/2003")。您正在接收零节点,因为您没有使用命名空间限定它。如果删除xmlns属性,则表示“// PropertyGroup”。 XPath会起作用。如何使用命名空间查询通常涉及将默认xmlns别名化为标识符(因为未在属性上指定一个),并选择类似“// myXMLNStoken:PropertyGroup”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top