2011-11-28 11 views
10

चलें कहते हैं कि मैं निम्नलिखित एक्सएमएल है (एक त्वरित उदाहरण)एक XML दस्तावेज

<rows> 
    <row> 
     <name>one</name> 
    </row> 
    <row> 
     <name>two</name> 
    </row> 
</rows> 

मैं तो मैं पंक्तियों की एक सूची बना सकते हैं XmlDocument और XPath (अंततः का उपयोग करके यह पार्स करने के लिए कोशिश कर रहा हूँ पार्स करने के लिए XPath का उपयोग करना)।

उदाहरण के लिए ...

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 

foreach(XmlNode row in doc.SelectNodes("//row")) 
{ 
    string rowName = row.SelectSingleNode("//name").InnerText; 
} 

क्यों, मेरे foreach पाश के भीतर, rowName हमेशा "एक" है? मुझे उम्मीद है कि यह पहली पुनरावृत्ति पर "एक" और दूसरे पर "दो" होने की उम्मीद है।

ऐसा लगता है कि // नाम को पंक्ति में पहले उदाहरण के बजाय, दस्तावेज़ में पहला उदाहरण मिलता है जैसा कि मैं अपेक्षा करता हूं। आखिरकार, मैं "पंक्ति" नोड पर विधि को बुला रहा हूं। यदि यह "यह कैसे काम करता है" तो क्या कोई यह बता सकता है कि मैं इसे अपनी आवश्यकताओं के अनुसार कैसे बदल सकता हूं?

धन्यवाद

+0

कैसे // पंक्ति/नाम से चुनने के बारे में? क्या यह काम करता है? – Steve

उत्तर

14

सही कोड आप वास्तव में तैनात है? मुझे पंक्ति पर एक संकलन त्रुटि मिलती है। चयन करें() क्योंकि यह XmlNode का सदस्य नहीं है।

वैसे भी, काम करता है ऊपर मेरे उदाहरण है, लेकिन केवल एक ही <name><row> नोड के भीतर नोड मान लिया गया है ताकि आप SelectNodes() बजाय SelectSingleNode() उपयोग करने के लिए करता है, तो ऐसा नहीं है की आवश्यकता हो सकती।

जैसा कि अन्य दिखाए गए हैं, केवल मूल्य प्राप्त करने के लिए .InnerText का उपयोग करें।

+0

धन्यवाद, और आपकी गति आपको पूर्ण 25 मिलती है! मैं एक स्लैश के साथ कोशिश कर रहा था, लेकिन जब उसने एक त्रुटि फेंक दी तो मैंने छोड़ दिया और बच्चे नोड्स को खोजने के लिए एक समारोह लिखा। अब अच्छा ओल 'XPath पर वापस आ गया है :) – musefan

+0

मेरी मूल पोस्ट में' इनरटेक्स्ट 'को भूल गया, अब तय किया गया है ... और गलत टाइप किया गया' SelectSingleNode' – musefan

3

एक सापेक्ष पथ का प्रयोग करें उदा। string rowName = row.SelectSingleNode("name").InnerText;

2

समस्या अपने दूसरे XPath क्वेरी में है:

//row 

यह एक वैश्विक गुंजाइश है, तो भले ही आप कहीं से फोन है, यह सभीrow तत्वों का चयन करेंगे।

.//row 
2

मैं SelectSingleNode का प्रयोग करेंगे, और फिर innerText संपत्ति:

यदि आप के साथ अपने अभिव्यक्ति की जगह काम करना चाहिए।

var rowName = row.SelectSingleNode("name").InnerText; 
4

LINQ से XML का उपयोग करें। अपने कोड फ़ाइल में using System.Xml.Linq; शामिल करें और फिर अपनी सूची

XDocument xDoc = XDocument.Load(filepath); 
IEnumerable<XElement> xNames; 

xNames = xDoc.Descendants("name"); 

है कि आप नाम तत्वों की सूची दे देंगे प्राप्त करने के लिए निम्न कोड है। तो फिर तुम चालू करने के लिए है कि एक List<string> में चाहते हैं, तो बस इस कार्य करें:

List<string> list = new List<string>(); 
foreach (XElement element in xNames) 
{ 
    list.Add(element.value); 
} 
4

आपकी दूसरी xpath // साथ शुरू होता है। यह /descendant-or-self::node() का संक्षिप्त नाम है, जिसे आप / से शुरू कर सकते हैं, जिसका अर्थ है कि यह दस्तावेज़ की रूट से खोजता है, जो भी संदर्भ आप इसका उपयोग करते हैं।the पंक्ति . Note the के तहत कहीं भी name नोड्स * खोजने के लिए

var rowName = row.SelectSingleNode("name"); 

name नोड्स तत्काल बच्चों row की हैं खोजने के लिए, या

var rowName = row.SelectSingleNode(".//name"); 

:

तुम शायद में से एक चाहते हैं । 'इस दूसरे xpath में जो xpath को संदर्भ नोड से प्रारंभ करने का कारण बनता है।

0

उपयोग निम्नलिखित

 doc.LoadXml(xml); 

      foreach(XmlNode row in doc.SelectNodes("/rows/row")) 
      { 
       string rowName = row.SelectSingleNode("//name").InnerText.ToString(); 
      } 
+0

यह वही समस्या पैदा करेगा जैसा मुझे शुरू करना था, क्षमा करें – musefan

+0

मुझे लॉल दोबारा दोहराएं, मैंने/पंक्तियों से छुटकारा पा लिया और बस इसे // पंक्ति के रूप में किया और यह मेरे लिए काम किया। –