2010-02-19 14 views
19

जब मैं LINQ XmlReader क्लास का उपयोग कर XML को पार्स करने का प्रयास करता हूं तो मुझे अजीब व्यवहार दिखाई दे रहा है। नीचे टेस्ट केस: ऐसा लगता है कि मैं X12Reader पर (XElement)XNode.ReadFrom(xmlReader) या Read() विधियों में से एक का उपयोग करता हूं, यह इनपुट XML में दूसरे bar तत्वों को याद करता है। यदि </bar> और <bar> के बीच कोई व्हाइटस्पेस जोड़ा गया है तो यह दूसरे bar तत्व को सही तरीके से पार्स करेगा।यदि कोई व्हाइटस्पेस विभाजक नहीं है तो XmlReader हर दूसरे तत्व को क्यों छोड़ देता है?

क्या किसी के पास कोई विचार है कि क्यों इनपुट स्ट्रीम गड़बड़ हो जाती है और इस समस्या को कैसे प्राप्त किया जाए?

[Test] 
    [Explicit] 
    public void ShouldParseCorrectNumberOfElements() 
    { 
     var xml = @"<foo><bar>wtf</bar><bar>wtf2</bar></foo>"; 
     XmlReader xmlReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(xml))); 

     int count = 0; 
     xmlReader.MoveToContent(); 
     while (xmlReader.Read()) 
     { 
      if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "bar") 
      { 
       var element = xmlReader.ReadOuterXml(); 
       Console.WriteLine("just got an " + element); 
       count++; 
      } 
     } 
     Assert.AreEqual(2, count); 
    } 
+0

पाश काफी 'ReadToFollowing (" बार ") का उपयोग करके अनुकूलित किया जा सकता है' बजाय 'पढ़ें()' (जॉन का जवाब भी साथ काम करता है):

यहाँ अपने पाश के लिए एक विकल्प है। –

+0

मेरे पास एक समान मामला है और मैं जबकि लूप के अंदर 'जबकि' और 'ReadOuterXml' के साथ' ReadToFollowing' का उपयोग कर रहा हूं। यदि दस्तावेज़ को न्यूलाइन के साथ स्वरूपित किया गया है तो यह ठीक से काम कर रहा है। जब मेरे पास एक सिंगल लाइन दस्तावेज़ होता है तो यह निम्नलिखित सभी नोड्स को छोड़ देता है। –

उत्तर

30

आप ReadOuterXml पर कॉल कर रहे हैं, जो तत्व का उपभोग करेगा और अगले तत्व से पहले "कर्सर" रखेगा। फिर आप Read को फिर से कॉल कर रहे हैं, जो कर्सर को ले जाता है (उदा। तत्व के भीतर टेक्स्ट नोड के लिए)।

while (!xmlReader.EOF) 
{ 
    Console.WriteLine(xmlReader.NodeType); 
    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "bar") 
    { 
     var element = xmlReader.ReadOuterXml(); 
     Console.WriteLine("just got an " + element); 
     count++;     
    } 
    else 
    { 
     xmlReader.Read(); 
    } 
} 
+0

ओह, वह "एक से दूर" महसूस कर रहा है ... धन्यवाद फिर से! –

6

आप शायद पढ़ें() जबकि पाश हालत भीतर समारोह और उसके बाद ReadOuterXml() फ़ंक्शन पाश के भीतर ही फोन करके एक लाइन लंघन कर रहे हैं?

संबंधित मुद्दे