2010-11-29 15 views
11

का उपयोग कर एक्सएमएल नोड्स से मेल खाने से विशेषता मान प्राप्त करें ऐसा लगता है कि यह मुश्किल होना चाहिए, लेकिन मैं वर्तमान में अटक गया हूं। मैं किसी दिए गए XPath क्वेरी स्ट्रिंग से मेल खाने वाले नोड्स से किसी विशेष विशेषता के लिए विशेषता मान प्राप्त करने का प्रयास कर रहा हूं। यहाँ मैं अब तक है:XPath क्वेरी

public static IEnumerable<string> GetAttributes(this XmlDocument xml, 
     string xpathQuery, string attributeName) 
    { 
     var doc = new XPathDocument(new XmlNodeReader(xml)); 
     XPathNavigator nav = doc.CreateNavigator(); 
     XPathExpression expr = nav.Compile(xpathQuery); 
     XPathNodeIterator iterator = nav.Select(expr); 
     while (iterator.MoveNext()) 
     { 
      XPathNavigator curNav = iterator.Current; 
      if (curNav.HasAttributes) 
      { 
       XmlNode curNode = ((IHasXmlNode)curNav).GetNode(); 
       if (null != curNode) 
       { 
        XmlAttribute attrib = curNode.Attributes[attributeName]; 
        if (null != attrib) 
        { 
         yield return attrib.Value; 
        } 
       } 
      } 
     } 
    } 

यह वर्तमान में एक अपवाद फेंकता है:

System.InvalidCastException: प्रकार की वस्तु कास्ट करने के लिए 'MS.Internal.Xml.Cache.XPathDocumentNavigator' टाइप करने के लिए 'में असमर्थ System.Xml.IHasXmlNode '।

क्या मैं इस गलत के बारे में जा रहा हूं? क्या नोड्स से मिलान करने वाले गुण मान प्राप्त करने का कोई आसान तरीका है?

+1

LinqToXml का उपयोग क्यों नहीं करें? यह शोर पर काफी कटौती करेगा जब तक कि मुझे कुछ कारण याद नहीं आ रहा है कि आप लिंक के साथ ऐसा क्यों नहीं कर पाए? –

उत्तर

31

निम्नलिखित एक्सएमएल के लिए:

<root> 
    <elem att='the value' /> 
</root> 

आप .net 3.5 उपयोग कर रहे हैं यह सी # कोड

XmlDocument xdoc = new XmlDocument(); 
    xdoc.LoadXml(text); 
    Console.WriteLine(xdoc.SelectSingleNode("/root/elem/@att").Value); 
+0

Derp। मैंने देखा था कि 'सिलेक्शन नोड' 'xmlElement' पर एक विधि थी, जैसे 'xmlDoc.DocumentElement', लेकिन' XmlDocument' को जांचना नहीं था। अपने उदाहरण का उपयोग करना, लेकिन मेरे लिए 'SelectNodes' काम करता है। –

+0

+1 अच्छा जवाब। –

4

साथ "मूल्य" पाठ प्राप्त कर सकते हैं या बाद में आप LINQ इस्तेमाल कर सकते हैं

एक्सएमएल के लिए दिए गए XML दस्तावेज़

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <storedProcedures> 
    <storedProcedure name="usp_GET_HOME_PAGE_DATA"> 
     <resultSet name="Features"/> 
     <resultSet name="Highlights"/> 
    </storedProcedure> 
    <storedProcedure name="usp_GET_FEATURES" /> 
    <storedProcedure name="usp_GET_FEATURE" /> 
    <storedProcedure name="usp_UPDATE_FEATURE" /> 
    <storedProcedure name="usp_GET_FEATURE_FOR_DISPLAY"> 
     <resultSet name="CurrentFeature"/> 
     <resultSet name="OtherFeatures"/> 
    </storedProcedure> 
    <storedProcedure name="usp_GET_HIGHLIGHT_TITLES"> 
     <resultSet name="Highlights"/> 
    </storedProcedure> 
    </storedProcedures> 
</root> 
के लिए

निम्नलिखित LINQ अभिव्यक्ति आप "नाम" के मूल्यों को प्राप्त होगा सभी storedProcedure नोड

XDocument xDcoument = XDocument.Load(xmlStoredProcSchemeFile); 

    var storedProcedureNames = from doc in xDcoument.Descendants("storedProcedure") 
          select doc.Attribute("name").Value; 

आप भी नियमित रूप से XPath सिंटैक्स का उपयोग कर सकता है की जिम्मेदार बताते हैं। वेरिएबल नोड के नीचे दिए गए कोड में "usp_GET_HOME_PAGE_DATA" नाम से पहचाना गया नोड होता है और फिर विशेषता चर चयनित नोड और उसके बच्चों के सभी बच्चे नोड्स (विशेषताओं) रखता है।

XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocument.Load(@"C:\inetpub\wwwroot\ASPNETBuilder\BusinessLayer\DataAccessCodeGenerationSchema.xml"); 
    var node = xmlDocument.DocumentElement.SelectSingleNode("./storedProcedures/storedProcedure[@name='usp_GET_HOME_PAGE_DATA']"); 
    var attributes = node.SelectNodes("./resultSet/@name"); 
+4

"आपको पूरी तरह से ड्रॉप करना चाहिए और jQuery का उपयोग करना चाहिए" –

+0

आप किस बारे में बात कर रहे हैं? यह सर्वर की ओर या एक जीयूआई क्लाइंट में है। आप जावास्क्रिप्ट/jQuery कहां से प्राप्त कर रहे हैं? –

+2

http://meta.stackexchange.com/questions/19478/the-many-memes-of-meta/19492#19492 **;) ** –

1

अपवाद के प्रारंभिक समस्या फेंके जाने का हल ...

var doc = new XPathDocument(new XmlNodeReader(xml)); 

द्वारा प्रतिस्थापित किया जाना चाहिए ...

var doc = new XmlDocument(); 
doc.load(*you can either specify the path to the file, the string out of which the xml document is to be generated or specify an xmlreader, look for more overloads*); 

यह अपवाद और कोड फेंक नहीं होगा ठीक काम करेगा।