Domanda

Sto provando un XPath molto semplice su questo xml (lo stesso di seguito), e non trova qualcosa. Sto provando sia .NET che questo sito web e XPaths come // PropertyGroup , / PropertyGroup e // MSBuildCommunityTasksPath semplicemente non funzionano per me (hanno compilato ma restituiscono zero risultati).

XML di origine:

<?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>
È stato utile?

Soluzione

Puoi aggiungere spazi dei nomi nel tuo codice e tutto il resto, ma puoi jolly efficacemente lo spazio dei nomi. Prova il seguente linguaggio di XPath.

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

name () di solito funziona anche, come in:

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

MODIFICA: Gli spazi dei nomi sono fantastici e non sto suggerendo che non siano importanti, ma i caratteri jolly sono utili quando si mettono insieme il codice prototipo, gli strumenti desktop unici, la sperimentazione con XSLT e così via. Bilancia le tue necessità di praticità con i rischi accettabili per l'attività da svolgere. Cordiali saluti, se necessario, è anche possibile rimuovere o riassegnare gli spazi dei nomi.

Altri suggerimenti

I tag nel documento finiscono nel " default " spazio dei nomi creato dall'attributo xmlns senza prefisso. Sfortunatamente, XPath da solo non può interrogare elementi nello spazio dei nomi predefinito. In realtà non sono sicuro dei dettagli semantici, ma devi collegare esplicitamente un prefisso a quello spazio dei nomi usando qualsiasi strumento che ospita XPath.

Potrebbe esserci un modo più breve per farlo in .NET, ma l'unico modo che ho visto è tramite NameSpaceManager. Dopo aver aggiunto esplicitamente uno spazio dei nomi, è possibile eseguire una query utilizzando il gestore dello spazio dei nomi come se tutti i tag nell'elemento namespace abbiano quel prefisso (ho scelto '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);
        }
    }
}

Il problema riguarda lo spazio dei nomi (xmlns = " http: //schemas.microsoft.com/developer/msbuild/2003"). Stai ricevendo zero nodi perché non lo qualifichi con lo spazio dei nomi. Se rimuovi l'attributo xmlns, il tuo " // gruppo di proprietà " XPath funzionerà. Il modo in cui esegui una query con lo spazio dei nomi di solito comporta l'aliasing di un xmlns predefinito a un identificatore (poiché non è specificato sull'attributo) e la selezione come " // myXMLNStoken: PropertyGroup " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top