2010-07-11 13 views
9

कैसे बच्चे तत्वों हो रही बिना XElement के एक मूल्य प्राप्त करने के लिए?XElement मूल्य

एक उदाहरण:

<?xml version="1.0" ?> 
<someNode> 
    someValue 
    <child>1</child> 
    <child>2</child> 
</someNode> 

तो मैं <someNode> के लिए XElement.Value का उपयोग मैं "somevalue<child>1</child><child>2<child>" स्ट्रिंग मिलता है, लेकिन मैं "<child>1</child><child>2<child>"-स्ट्रिंग के बिना केवल "somevalue" प्राप्त करना चाहते हैं।

उत्तर

11

आप थोड़ा और अधिक बस Descendants का उपयोग करने से यह कर सकते हैं - Nodes विधि केवल रिटर्न प्रत्यक्ष बच्चे नोड्स:

XElement element = XElement.Parse(
    @"<someNode>somevalue<child>1</child><child>2</child></someNode>"); 
var firstTextValue = element.Nodes().OfType<XText>().First().Value; 

ध्यान दें कि इस मामले जहां बच्चे तत्वों पाठ नोड से पहले आया था, इस तरह में भी काम करेगा:

XElement element = XElement.Parse(
    @"<someNode><child>1</child><child>2</child>some value</someNode>"); 
var firstTextValue = element.Nodes().OfType<XText>().First().Value; 
+0

यदि मैं सभी नोड्स का मान प्राप्त करना चाहता हूं तो क्या मुझे जरूरी नोड्स की सूची को फिर से चालू करने की आवश्यकता है? खैर, अगर आप सभी नोड्स को देखने के लिए चाहते हैं, तो हां, तो आप उन पर पुनरावृति करने की जरूरत है: मैं नोड्स XText –

+0

@BBHorus प्रकार के नहीं हैं के मूल्यों में दिलचस्पी रखता हूँ। यह वास्तव में स्पष्ट नहीं है कि आप क्या करने का प्रयास कर रहे हैं - आप एक नया प्रश्न जोड़ना चाहेंगे। –

+0

ओह अब कभी नहीं सोचा मुझे एहसास हुआ कि मुझे कुछ टेक्स्ट नोड्स की आवश्यकता है लेकिन पहले और आखिरी। पैकेज कॉम: मैं इस तत्व की है। नमूना ऐप 1; क्या मैं चाहता हूँ इस तरह एक मूल्य है: com.sample.app1, मुझे लगता है कि मैं कुछ regex या बच्चे नोड्स पुनरावृति और केवल पहली और आखिरी लोगों लंघन तत्वों मिल की तरह कुछ और ही प्रयोग करना होगा। –

3

कोई सीधा तरीका नहीं है। आपको फिर से शुरू करना होगा और चयन करना होगा। उदाहरण के लिए:

var doc = XDocument.Parse(
    @"<someNode>somevalue<child>1</child><child>2</child></someNode>"); 
var textNodes = from node in doc.DescendantNodes() 
       where node is XText 
       select (XText)node; 
foreach (var textNode in textNodes) 
{ 
    Console.WriteLine(textNode.Value); 
} 
+0

महान धन्यवाद। मेरे कार्यक्रम में मुझे एक्सएमएल नोड्स की पूर्ण गणना में आवश्यकता है और प्रत्येक मान को बदलता है। आपके नमूने के साथ मुझे एक्सएमएल नोड्स के रिकर्सिव एनम में जरूरी नहीं है। – shadeglare

+0

@MaxFX: यह अभी भी तत्व के भीतर सभी नोड्स को फिर से समझा जाएगा। यह छिपा हुआ है, लेकिन यह अभी भी हो रहा है। इससे बचने के तरीके के लिए मेरा जवाब देखें। –

+1

आप बस var textNodes = doc.DescendantNodes() लिख सकते हैं। ऑफ टाइप (); – Porkopek

0

मुझे लगता है कि आप पहली बार वंशज नोड होगा चाहते हैं, इसलिए कुछ की तरह:

var value = XElement.Descendents.First().Value; 

कहाँ XElement तत्व अपने <someNode> तत्व का प्रतिनिधित्व करता है।

आप विशेष रूप से पहले पाठ तत्व के लिए पूछ सकते हैं (जो कि "somevalue") है, तो आप भी कर सकता है:

var value = XElement.Descendents.OfType<XText>().First().Value; 
संबंधित मुद्दे