10

この xml (以下と同じ) で非常に基本的な XPath を試していますが、何も見つかりません。.NET とこのウェブサイト//PropertyGroup/PropertyGroupおよびなどの XPath の両方を試しています//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>
4

3 に答える 3

16

コードなどに名前空間を追加できますが、効果的に名前空間をワイルドカード化できます。次の XPath イディオムを試してください。

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

name() は通常、次のように機能します。

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

編集:名前空間は素晴らしいものであり、重要ではないと言っているわけではありませんが、ワイルドカードを使用すると、プロトタイプ コード、1 回限りのデスクトップ ツール、XSLT の実験などを組み合わせるときに便利です。利便性に対するニーズと、目の前のタスクで許容できるリスクとのバランスをとってください。参考までに、必要に応じて、名前空間を削除または再割り当てすることもできます。

于 2008-09-19T18:39:14.867 に答える
2

ドキュメント内のタグは、接頭辞のない 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);
        }
    }
}
于 2008-09-19T17:29:17.360 に答える
1

問題は名前空間にあります (xmlns="http://schemas.microsoft.com/developer/msbuild/2003")。名前空間で修飾していないため、ゼロ ノードを受け取っています。xmlns 属性を削除すると、「//PropertyGroup」XPath が機能します。名前空間を使用してクエリを実行する方法には、通常、既定の xmlns を識別子にエイリアスし (属性に識別子が指定されていないため)、"//myXMLNStoken:PropertyGroup" のように選択する必要があります。

于 2008-09-19T16:49:03.977 に答える