Frage

Ich versuche, eine sehr grundlegende XPath auf dieser xml (die gleiche wie unten), und es funktioniert nicht irgendetwas finden. Ich versuche, sowohl .NET und dieser Website und XPaths wie //PropertyGroup, /PropertyGroup und //MSBuildCommunityTasksPath sind einfach nicht für mich arbeiten (sie kompiliert aber Null Ergebnisse angezeigt).

Quelle 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>
War es hilfreich?

Lösung

Sie können Namespaces in Ihrem Code hinzufügen, und all das, aber Sie können den Namensraum effektiv Platzhalter. Versuchen Sie, die folgende XPath Idiom.

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

name () funktioniert in der Regel auch, wie in:

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

EDIT: Namensräume sind groß , und ich sage nicht, sie nicht wichtig sind, aber sie ist praktisch, wenn die Stellvertreterzeichen Prototyp Code Schuster zusammen, one-off Desktop-Tool, mit XSLT zu experimentieren, und so weiter. Balancieren Sie Ihr Bedürfnis nach Bequemlichkeit gegen akzeptables Risiko für die anstehende Aufgabe. Zu Ihrer Information, wenn nötig, können Sie auch Namensräume Streifen oder neu zuweisen.

Andere Tipps

Die Tags im Dokument am Ende von dem xmlns ohne Präfix-Attribut erstellt in der „default“ Namespace-up. Leider kann XPath allein nicht Elemente in der Standard-Namespace abfragen. Ich bin eigentlich der semantischen Details nicht sicher, aber Sie müssen explizit ein Präfix zu diesem Namespace anhängen verwenden Sie das Werkzeug präsentiert XPath.

Es kann ein kürzerer Weg, dies in .NET zu tun, aber der einzigen Weg, ich habe über eine NameSpaceManager gesehen ist. Nachdem Sie explizit einen Namensraum hinzugefügt haben, können Sie den Namespace-Manager-Abfrage verwenden, als ob alle Tags im Namensraum Element dieses Präfix (ich wählte ‚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);
        }
    }
}

Ihr Problem ist, mit dem Namespace (xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"). Sie erhalten null Knoten, weil Sie es nicht mit dem Namensraum gewährt wird. Wenn Sie das xmlns entfernen Attribut, Ihre „// Property“ XPath funktioniert. Wie Sie abfragen, in der Regel mit Namensraum ein Standard xmlns auf eine Kennung beinhaltet Aliasing (da man nicht auf dem Attribut angegeben), und wählen Sie wie. „// myXMLNStoken: Property“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top