2010-02-12 12 views
5

का उपयोग करके मैं एक बड़ी एक्सएमएल फ़ाइल (100 + एम) पढ़ना चाहता हूं। इसके आकार के कारण, मैं XElement का उपयोग करके इसे स्मृति में लोड नहीं करना चाहता हूं। मैं विश्लेषण और पढ़ने के लिए linq-xml प्रश्नों का उपयोग कर रहा हूँ।बड़ी xml फ़ाइल को स्मृति में लोड किए बिना और XElement

ऐसा करने का सबसे अच्छा तरीका क्या है? Linq-xml/XElement के साथ XPath या XmlReader के संयोजन पर कोई उदाहरण?

कृपया मदद करें। धन्यवाद।

उत्तर

8

हां, आप method XNode.ReadFrom के साथ XmlReader को जोड़ सकते हैं, XMLReader द्वारा XElement के रूप में प्राप्त नोड्स को चुनने के लिए सी # का उपयोग करने वाले प्रलेखन में उदाहरण देखें।

+0

शानदार। मैं एक ऐप विकसित कर रहा हूं जो कई 200 एम एक्सएमएल फाइलों को प्रोसेस करेगा और एक्स डॉक्यूमेंट मुझे मार रहा था। इसने एक बड़ा सुधार किया है। धन्यवाद। –

+4

मुझे लगता है कि 'XNode.ReadFrom' दस्तावेज़ पृष्ठ पर उदाहरण कोड में एक बग है। कथन 'XElement el = XElement.ReadFrom (पाठक) XElement के रूप में; 'XElement el = new XElement (reader.Name, reader.Value) होना चाहिए;' इसके बजाय। जैसा कि, प्रत्येक दो 'बाल' तत्वों में से पहला एक्सएमएल फ़ाइल में छोड़ा जाता है, जिससे वह पढ़ता है। –

+0

मेरी आखिरी टिप्पणी या तो बिल्कुल सही नहीं है; अब मेरे लिए इस पर काम कर रहा है ... –

0

बस ध्यान रखें कि आपको अनुक्रमिक रूप से फ़ाइल को पढ़ना होगा और भाई बहनों या वंशजों का जिक्र करना सबसे खराब और असंभव रूप से धीमा होने वाला है। अन्यथा @ मार्टिनहॉन की कुंजी है।

class Program 
{ 
    static IEnumerable<XElement> StreamRootChildDoc(string uri) 
    { 
     using (XmlReader reader = XmlReader.Create(uri)) 
     { 
      reader.MoveToContent(); 
      // Parse the file and display each of the nodes. 
      while (reader.Read()) 
      { 
       switch (reader.NodeType) 
       { 
        case XmlNodeType.Element: 
         if (reader.Name == "Child") 
         { 
          XElement el = XElement.ReadFrom(reader) as XElement; 
          if (el != null) 
           yield return el; 
         } 
         break; 
       } 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     IEnumerable<string> grandChildData = 
      from el in StreamRootChildDoc("Source.xml") 
      where (int)el.Attribute("Key") > 1 
      select (string)el.Element("GrandChild"); 

     foreach (string str in grandChildData) 
      Console.WriteLine(str); 
    } 
} 

लेकिन मैं पाया है कि उदाहरण में StreamRootChildDoc विधि इस प्रकार संशोधित करने की आवश्यकता:

+0

यह उत्तर हटा दिया जाना चाहिए और इसके बजाय टिप्पणी के रूप में जोड़ा जाना चाहिए। –

5

XNode.ReadFrom विधि के लिए MSDN दस्तावेज में उदाहरण कोड इस प्रकार है

static IEnumerable<XElement> StreamRootChildDoc(string uri) 
    { 
     using (XmlReader reader = XmlReader.Create(uri)) 
     { 
      reader.MoveToContent(); 
      // Parse the file and display each of the nodes. 
      while (!reader.EOF) 
      { 
       if (reader.NodeType == XmlNodeType.Element && reader.Name == "Child") 
       { 
        XElement el = XElement.ReadFrom(reader) as XElement; 
        if (el != null) 
         yield return el; 
       } 
       else 
       { 
        reader.Read(); 
       } 
      } 
     } 
    } 
संबंधित मुद्दे

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