2010-09-19 16 views
10

मुझे निश्चित रूप से यहां कुछ महत्वपूर्ण जानकारी याद आ रही है। मैं सिर्फ विजुअल स्टूडियो प्रोजेक्ट फाइलों के साथ .NET का XPath काम नहीं कर सकता।XPath और * .csproj

के एक xml दस्तावेज़ लोड करते हैं:

var doc = new XmlDocument(); 
doc.Load("blah/blah.csproj"); 

अब मेरी क्वेरी निष्पादित करें:

var nodes = doc.SelectNodes("//ItemGroup"); 
Console.WriteLine(nodes.Count); // whoops, zero 
बेशक

, फ़ाइल में ItemGroup नामित नोड्स रहे हैं। इसके अलावा, यह क्वेरी काम करती है:

var nodes = doc.SelectNodes("//*/@Include"); 
Console.WriteLine(nodes.Count); // found some 

अन्य दस्तावेजों के साथ, XPath बस ठीक काम करता है। मैं इसके बारे में बिल्कुल परेशान हूं। क्या कोई मुझे बता सकता है कि क्या हो रहा है?

+0

कैसे 'बारे में वर नोड्स = doc.SelectNodes (" // */ItemGroup ");' मैं अब मैक ओएस एक्स में हूँ तो सत्यापित नहीं कर सकता। – Strelok

उत्तर

14

आप शायद नाम स्थान http://schemas.microsoft.com/developer/msbuild/2003 के लिए एक संदर्भ जोड़ने की जरूरत है।

मुझे एक ही समस्या थी, मैंने इसके बारे में here लिखा था। कुछ इस तरह है:

XmlDocument xdDoc = new XmlDocument(); 
xdDoc.Load("blah/blah.csproj"); 

XmlNamespaceManager xnManager = 
new XmlNamespaceManager(xdDoc.NameTable); 
xnManager.AddNamespace("tu", 
"http://schemas.microsoft.com/developer/msbuild/2003"); 

XmlNode xnRoot = xdDoc.DocumentElement; 
XmlNodeList xnlPages = xnRoot.SelectNodes("//tu:ItemGroup", xnManager); 
+0

जो ** संभवतः ** काम नहीं कर सकता है, क्योंकि आपने * उपनाम * का उपयोग नहीं किया है ... –

+0

यह गलत है ... –

+0

हाँ, मैंने xpath –

9

रूट नेमस्पेस को देखें; आपको एक एक्सएमएल-नेमस्पेस मैनेजर शामिल करना होगा और "// x: ItemGroup" जैसे प्रश्नों का उपयोग करना होगा, जहां "x" रूट नेमस्पेस के लिए आपका नामित उपनाम है। और प्रबंधक को क्वेरी में पास करें। उदाहरण के लिए:

 XmlDocument doc = new XmlDocument(); 
     doc.Load("my.csproj"); 

     XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
     mgr.AddNamespace("foo", doc.DocumentElement.NamespaceURI); 
     XmlNode firstCompile = doc.SelectSingleNode("//foo:Compile", mgr); 
+0

नामस्थान जोड़ना चाल था। दयालु है कि कोई प्रश्न के लिए दो उत्तरों को स्वीकार नहीं कर सकता :-) – catbert

+1

@catbert: आप अपने वर्तमान स्वीकृत उत्तर (जो गलत है) को उलट सकते हैं, और सही (@ मार्क-ग्रेवल का जवाब) स्वीकार कर सकते हैं। न केवल आप कर सकते हैं, लेकिन आपको ऐसा करना चाहिए, क्योंकि अन्यथा कुछ लोग सोचेंगे कि गलत/स्वीकृत उत्तर सही है। –

+0

+1 यह कठोर है। –

5

मैं कम से ऊपर एक LINQ/XML संस्करण तैनात:

http://granadacoder.wordpress.com/2012/10/11/how-to-find-references-in-a-c-project-file-csproj-using-linq-xml/

लेकिन यहाँ यह का सार है। यह 100% सही नहीं हो सकता है ...... लेकिन यह विचार दिखाता है।

मैं यहां कोड पोस्ट कर रहा हूं, क्योंकि मुझे जवाब के लिए खोज करते समय यह (मूल पोस्ट) मिला। तब मैं खोज करने से थक गया और अपना खुद लिखा।

  string fileName = @"C:\MyFolder\MyProjectFile.csproj"; 

      XDocument xDoc = XDocument.Load(fileName); 

      XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003"); 

      //References "By DLL (file)" 
      var list1 = from list in xDoc.Descendants(ns + "ItemGroup") 
         from item in list.Elements(ns + "Reference") 
         /* where item.Element(ns + "HintPath") != null */ 
        select new 
         { 
          CsProjFileName = fileName, 
          ReferenceInclude = item.Attribute("Include").Value, 
          RefType = (item.Element(ns + "HintPath") == null) ? "CompiledDLLInGac" : "CompiledDLL", 
          HintPath = (item.Element(ns + "HintPath") == null) ? string.Empty : item.Element(ns + "HintPath").Value 
         }; 


      foreach (var v in list1) 
      { 
       Console.WriteLine(v.ToString()); 
      } 


      //References "By Project" 
      var list2 = from list in xDoc.Descendants(ns + "ItemGroup") 
         from item in list.Elements(ns + "ProjectReference") 
         where 
         item.Element(ns + "Project") != null 
         select new 
         { 
          CsProjFileName = fileName, 
          ReferenceInclude = item.Attribute("Include").Value, 
          RefType = "ProjectReference", 
          ProjectGuid = item.Element(ns + "Project").Value 
         }; 


      foreach (var v in list2) 
      { 
       Console.WriteLine(v.ToString()); 
      } 
+0

में उपनाम को 100% सही नहीं छोड़ा? यह मुझे ठीक करने के लिए उपयुक्त है लेकिन अगर आप मुझे 2 साल – mechanicum

+0

के बाद पूछना नहीं चाहते हैं तो मुझे क्या नुकसान होगा, मुझे नहीं पता कि यह जीएसी संदर्भों के साथ क्या करता है, यह एकमात्र अज्ञात है, क्योंकि मैं शायद ही कभी मुख्य ढांचे के बाहर जीएसी संदर्भ करता हूं। यह इसके बारे में। जब भी मुझे गरीब व्यक्ति की "संदर्भ रिपोर्ट" की आवश्यकता होती है तब भी मैं स्क्रिप्ट का उपयोग करता हूं ... – granadaCoder