2008-09-19 10 views
10

this xml (aşağıda olduğu gibi) üzerinde çok basit bir XPath çalışıyorum ve hiçbir şey bulamıyorum. Hem .NET hem de this website çalışıyorum ve //PropertyGroup, /PropertyGroup ve //MSBuildCommunityTasksPath gibi XPath'lar benim için çalışmıyorlar (derlenmişler ancak sıfır sonuçlarına döndüler).XPath/XML'imde neyin var?

Kaynak 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> 
+0

Neye denediğiniz hakkında kısa bir kod örneği verebilirseniz. Neyin yanlış gitebileceğini önermek daha kolay olacaktır. – morechilli

cevap

16

Sen ad alanlarını ekleyebilirsiniz: Açıkça bir ad ekledikten sonra isim alanlı eleman tüm etiketler önek (ı 'msbuild' seçti) o varsa, sen ad yöneticisini kullanarak sorgulayabilir Bu, ancak ad alanını etkili bir şekilde joker olarak kullanabilirsiniz. Aşağıdaki XPath deyimini deneyin.

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

DÜZENLEME: Ad alanları harika ve onlar önemli değil düşündüren, ancak bunları joker karakterler değilim kullanışlı

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

adı() genellikle olduğu gibi, hem çalışıyor prototip kodunu bir araya getirirken, tek seferlik masaüstü araçları, XSLT ile deneme, vb. Eldeki görev için kabul edilebilir risklere karşı rahatlık ihtiyacınızı dengeleyin. FYI, gerekirse, ad alanlarını da şeritleyebilir veya yeniden atayabilirsiniz.

+0

Teşekkür ederim! Bu cevap için ne kadar uzun zamandır avlandığımı bilemezsin. Parlak! – Gerard

+0

Bu cevap, sadece sahip olduğum bir sorunu çözdü, teşekkürler! –

+0

@Abel Morelos - yardım ettiğine sevindim; Sonunda bu kadar çok ay önce keşfettiğimde, XML çalışmasını ** çok daha kolay hale getirdi. –

1

Sorununuz ad ile (xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"). Ad alanıyla nitelendirilmediğinden sıfır düğümler alıyorsunuz. Xmlns özniteliğini kaldırırsanız, "// PropertyGroup" XPath çalışacaktır. Ad alanıyla sorgulama genellikle bir varsayılan xmlns'i bir tanımlayıcıya (öznitelikte belirtilmemiş olduğundan) ve "// myXMLNStoken: PropertyGroup" gibi seçmeyi içerir.

2

Belgede bulunan etiketler, önek olmadan xmlns özniteliği tarafından oluşturulan "varsayılan" ad alanında bulunur. Ne yazık ki, XPath, varsayılan ad alanındaki öğeleri sorgulayamaz. Ben aslında semantik detaylardan emin değilim, ama XPath'ı barındıran herhangi bir araç kullanarak açık bir şekilde bu ad alanına bir önek eklemelisiniz.

Bunu .NET'te yapmak için daha kısa bir yol olabilir, ancak gördüğüm tek şey bir NameSpaceManager aracılığıyla. Kodunuzdaki ve tüm

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); 
     } 
    } 
}