Question

J'essaie un XPath très basique sur ce xml (comme ci-dessous), mais ce n'est pas le cas trouver n'importe quoi. J'essaie à la fois .NET et ce site Web , ainsi que des XPaths tels que // PropertyGroup , / PropertyGroup et // MSBuildCommunityTasksPath ne fonctionnent tout simplement pas pour moi (ils ont été compilés mais ne donnent aucun résultat).

XML source:

<?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>
Était-ce utile?

La solution

Vous pouvez ajouter des espaces de noms dans votre code et tout le reste, mais vous pouvez également utiliser un caractère générique pour le rendre générique. Essayez le langage XPath suivant.

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

name () fonctionne généralement aussi bien, comme dans:

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

EDIT: les espaces de noms sont excellents et je ne dis pas qu'ils ne sont pas importants, mais les jokers sont très utiles lorsque vous bricolez du code prototype, des outils de bureau uniques, l'expérimentation de XSLT et etc. Équilibrez votre besoin de commodité par rapport à un risque acceptable pour la tâche à accomplir. Au besoin, vous pouvez également supprimer ou réaffecter des espaces de noms.

Autres conseils

Les balises du document se retrouvent dans la liste " défaut " espace de noms créé par l'attribut xmlns sans préfixe. Malheureusement, XPath seul ne peut pas interroger les éléments dans l'espace de noms par défaut. En réalité, je ne suis pas sûr des détails sémantiques, mais vous devez associer explicitement un préfixe à cet espace de noms à l'aide de l'outil hébergeant XPath.

Il existe peut-être un moyen plus court de le faire dans .NET, mais le seul moyen que j’ai vu consiste à utiliser un NameSpaceManager. Après avoir explicitement ajouté un espace de noms, vous pouvez interroger à l'aide du gestionnaire d'espaces de noms comme si toutes les balises de l'élément namespaced avaient ce préfixe (j'ai choisi '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);
        }
    }
}

Votre problème concerne l’espace de nom (xmlns = & http; //schemas.microsoft.com/developer/msbuild/2003"). Vous ne recevez aucun nœud parce que vous ne le qualifiez pas avec l'espace de noms. Si vous supprimez l'attribut xmlns, votre " // PropertyGroup " XPath fonctionnera. La manière dont vous interrogez avec un espace de noms implique généralement de créneler un xmlns par défaut en un identifiant (celui-ci n'étant pas spécifié sur l'attribut), et de sélectionner l'option "// myXMLNStoken: PropertyGroup".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top