2010-04-07 25 views
6

मैं उन वस्तुओं का चयन करने के लिए XPath का उपयोग करने का प्रयास कर रहा हूं जिनके पास Location मानों के साथ एक पहलू है, लेकिन वर्तमान में सभी आइटमों को चुनने के लिए भी मेरे प्रयास विफल हो जाते हैं: सिस्टम खुशी से रिपोर्ट करता है कि उसे 0 आइटम मिलते हैं, फिर रिटर्न (इसके बजाय नोड्स को foreach लूप द्वारा संसाधित किया जाना चाहिए)। मैं या तो मेरी मूल क्वेरी बनाने या बस XPath को काम करने में सहायता की सराहना करता हूं।सी # XPath कुछ भी नहीं ढूंढ रहा

एक्सएमएल

<?xml version="1.0" encoding="UTF-8" ?> 
<Collection Name="My Collection" SchemaVersion="1.0" xmlns="http://schemas.microsoft.com/collection/metadata/2009" xmlns:p="http://schemas.microsoft.com/livelabs/pivot/collection/2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<FacetCategories> 
    <FacetCategory Name="Current Address" Type="Location"/> 
    <FacetCategory Name="Previous Addresses" Type="Location" /> 
</FacetCategories> 
    <Items> 
     <Item Id="1" Name="John Doe"> 
      <Facets> 
       <Facet Name="Current Address"> 
        <Location Value="101 America Rd, A Dorm Rm 000, Chapel Hill, NC 27514" /> 
       </Facet> 
       <Facet Name="Previous Addresses"> 
        <Location Value="123 Anywhere Ln, Darien, CT 06820" /> 
        <Location Value="000 Foobar Rd, Cary, NC 27519" /> 
       </Facet> 
      </Facets> 
     </Item> 
    </Items> 
</Collection> 

सी #

public void countItems(string fileName) 
{ 
    XmlDocument document = new XmlDocument(); 
    document.Load(fileName); 
    XmlNode root = document.DocumentElement; 
    XmlNodeList xnl = root.SelectNodes("//Item"); 
    Console.WriteLine(String.Format("Found {0} items" , xnl.Count)); 
} 

इस से विधि के लिए अधिक है, लेकिन जब से यह है कि मैं यह सोचते हैं रहा हूँ चलाने हो जाता है सभी है समस्या यहाँ निहित है। कॉलिंग root.ChildNodes सटीक रूप से FacetCategories और Items लौटाता है, इसलिए मैं पूरी तरह से नुकसान में हूं।

आपकी मदद के लिए धन्यवाद!

उत्तर

17

आपके मूल तत्व का नामस्थान है। आपको एक नेमस्पेस रिज़ॉल्वर जोड़ने और अपनी क्वेरी में तत्वों को उपसर्ग करने की आवश्यकता होगी।

This article समाधान बताता है। मैंने आपके कोड को संशोधित किया है ताकि इसे 1 परिणाम मिल सके।

public void countItems(string fileName) 
{ 
    XmlDocument document = new XmlDocument(); 
    document.Load(fileName); 
    XmlNode root = document.DocumentElement; 

    // create ns manager 
    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(document.NameTable); 
    xmlnsManager.AddNamespace("def", "http://schemas.microsoft.com/collection/metadata/2009"); 

    // use ns manager 
    XmlNodeList xnl = root.SelectNodes("//def:Item", xmlnsManager); 
    Response.Write(String.Format("Found {0} items" , xnl.Count)); 
} 
6

क्योंकि आप अपनी रूट नोड पर एक XML नामस्थान होता है, इसलिए "आइटम" अपने XML दस्तावेज में जैसी कोई चीज नहीं है, केवल "[नाम स्थान]: आइटम", इसलिए जब XPath के साथ एक नोड के लिए खोज, आपको नामस्थान निर्दिष्ट करने की आवश्यकता है।

यदि आपको यह पसंद नहीं है, तो आप स्थानीय तत्व() फ़ंक्शन का उपयोग उन सभी तत्वों से मेल खाने के लिए कर सकते हैं जिनके स्थानीय नाम (उपसर्ग के अलावा नाम भाग) वह मान है जिसे आप ढूंढ रहे हैं। यह थोड़ा बदसूरत वाक्यविन्यास है, लेकिन यह काम करता है।

XmlNodeList xnl = root.SelectNodes("//*[local-name()='Item']"); 
संबंधित मुद्दे