2008-09-19 14 views
10

मैं this xml (नीचे जैसा ही) पर एक बहुत ही बुनियादी XPath का प्रयास कर रहा हूं, और इसे कुछ भी नहीं मिला है। मैं .NET और this website दोनों की कोशिश कर रहा हूं, और //PropertyGroup, /PropertyGroup और //MSBuildCommunityTasksPath जैसे XPath बस मेरे लिए काम नहीं कर रहे हैं (वे संकलित हैं लेकिन शून्य परिणाम लौटाते हैं)।मेरे XPath/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

यदि आप जो भी प्रयास किया है उसका संक्षिप्त कोड नमूना प्रदान कर सकते हैं। नेट यह सुझाव देना आसान कर देगा कि क्या गलत हो रहा है। – morechilli

उत्तर

16

अपने कोड में और सभी नामस्थान में जोड़ सकते हैं कि, लेकिन आप नामस्थान को प्रभावी ढंग से वाइल्डकार्ड कर सकते हैं। निम्नलिखित XPath मुहावरे का प्रयास करें।

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

संपादित करें: नेमस्पेस महान कर रहे हैं और मैं सुझाव दे नहीं कर रहा हूँ वे महत्वपूर्ण नहीं हैं, लेकिन उन्हें wildcarding काम में आता

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

नाम() आम तौर पर साथ ही, में काम करता है प्रोटोटाइप कोड, एक-ऑफ डेस्कटॉप टूल्स, एक्सएसएलटी के साथ प्रयोग करते हुए, और आगे के साथ कोबलिंग करते समय। हाथ में कार्य के लिए स्वीकार्य जोखिम के खिलाफ सुविधा के लिए अपनी आवश्यकता को संतुलित करें। एफवाईआई, यदि आवश्यक हो, तो आप नेमस्पेस को भी पट्टी या फिर से सौंप सकते हैं।

+0

धन्यवाद! आपको पता नहीं है कि मैंने इस जवाब के लिए कितनी देर तक शिकार किया है। प्रतिभाशाली! – Gerard

+0

यह उत्तर सिर्फ एक समस्या हल हो गया था, धन्यवाद! –

+0

@ एबेल मोरेलोस - खुशी हुई इससे मदद मिली; जब मैंने आखिरकार कई चंद्रमाओं की खोज की तो यह एक्सएमएल काम ** ** ** बहुत आसान बना दिया। –

1

आपका मुद्दा नाम स्थान के साथ है (xmlns = "http://schemas.microsoft.com/developer/msbuild/2003")। आपको शून्य नोड्स प्राप्त हो रहे हैं क्योंकि आप इसे नामस्थान के साथ अर्हता प्राप्त नहीं कर रहे हैं। यदि आप xmlns विशेषता को हटाते हैं, तो आपका "// PropertyGroup" XPath काम करेगा। आप नेमस्पेस से कैसे पूछताछ करते हैं आमतौर पर एक पहचानकर्ता को डिफ़ॉल्ट xmlns को अलियासिंग करना शामिल है (चूंकि कोई विशेषता पर निर्दिष्ट नहीं है), और "// myXMLNStoken: PropertyGroup" जैसे चयन करना शामिल है।

2

दस्तावेज़ में टैग किसी भी उपसर्ग के साथ xmlns विशेषता द्वारा बनाए गए "डिफ़ॉल्ट" नामस्थान में समाप्त होते हैं। दुर्भाग्य से, अकेले XPath डिफ़ॉल्ट नामस्थान में तत्वों से क्वेरी नहीं कर सकता है। मैं वास्तव में अर्थपूर्ण विवरणों के बारे में निश्चित नहीं हूं, लेकिन आपको XPath को होस्ट करने वाले किसी भी टूल का उपयोग करके उस नामस्थान पर एक उपसर्ग को स्पष्ट रूप से संलग्न करना होगा।

.NET में ऐसा करने का एक छोटा रास्ता हो सकता है, लेकिन मैंने देखा है कि एकमात्र तरीका नामस्थान स्पेस प्रबंधक के माध्यम से है। आप स्पष्ट रूप से एक नाम स्थान जोड़ने के बाद, आप नाम स्थान प्रबंधक का उपयोग कर क्वेरी कर सकता है के रूप में यदि namespaced तत्व में रहने वाले सभी टैग उपसर्ग (मैं '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); 
     } 
    } 
} 
संबंधित मुद्दे