2009-10-14 10 views
13

मैं बड़ी फ़ाइलों की एक बड़ी संख्या को पार्स कर रहा हूँ से और मेरे टोंटी की रूपरेखा के बाद XmlNodes का निर्माण करना है:कैसे XmlReader

XmlDocument doc = new XmlDocument(); 
doc.Load(filename); 

यह दृष्टिकोण बहुत आसान था, क्योंकि मैं इस तरह नोड्स निकाल सकते:

XmlNodeList nodeList = doc.SelectNodes("myXPath"); 

मैं XmlReader का उपयोग करने जा रहा हूँ, लेकिन मैं निकालने मैं कैसे इसे से एक XmlNode का निर्माण करने के XmlReader के साथ भी परिचित के रूप में नहीं के संबंध में फंस कर रहा हूँ की जरूरत है जब मैं तत्व को खोजने:

XmlReader xmlReader = XmlReader.Create(fileName); 

while (xmlReader.Read()) 
{ 
    //keep reading until we see my element 
    if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element)) 
    { 
     // How do I get the Xml element from the reader here? 
    } 
} 

मैं List<XmlNode> ऑब्जेक्ट बनाने में सक्षम होना चाहता हूं। मैं पर हूं .NET 2.0

किसी भी मदद की सराहना की!

उत्तर

6

XmlNode प्रकार में सार्वजनिक निर्माता नहीं है, इसलिए आप उन्हें स्वयं नहीं बना सकते हैं। आप एक XmlDocument है कि आप उन्हें बनाने के लिए उपयोग कर सकते हैं की आवश्यकता होगी:

XmlDocument doc = new XmlDocument(); 
while (xmlReader.Read()) 
{ 
    //keep reading until we see my element 
    if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element)) 
    { 
     // How do I get the Xml element from the reader here? 
     XmlNode myNode = doc.CreateNode(XmlNodeType.Element, xmlReader.Name, ""); 
     nodeList.Add(myNode); 
    }   
} 
+1

ऐसा लगता है कि यह खाली नोड्स बना रहा है? – JohnIdol

+0

हां, जब तक आप तत्वों में कुछ भी नहीं जोड़ते (उदाहरण के लिए 'इनरटेक्स्ट' संपत्ति को कुछ निर्दिष्ट करके) वे खाली होंगे। –

+0

ओह हाँ - अब स्पष्ट दिखता है क्योंकि मैं सिर्फ तत्व नाम पास कर रहा हूं, धन्यवाद – JohnIdol

5

XmlReader और XmlDocument प्रसंस्करण की एक बहुत ही अलग रास्ता नहीं है। XmlReader स्मृति में कुछ भी नहीं रखता है और XmlDocument के लिए मेमोरी में एक पूर्ण डोम पेड़ बनाने के विरोध में एकमात्र दृष्टिकोण का उपयोग करता है। जब प्रदर्शन एक मुद्दा है, तो यह सहायक होता है, लेकिन आपको अपने आवेदन को अलग-अलग लिखने की भी आवश्यकता होती है: XmlNode का उपयोग करने के बजाय, आप कुछ भी नहीं रखते हैं और केवल "चलते समय" प्रक्रिया करते हैं: यानी, जब कोई तत्व आपको उस आवश्यकता से गुजरता है , आप कुछ करें। यह SAX दृष्टिकोण के करीब है, लेकिन कॉलबैक मॉडल के बिना।

"XmlElement कैसे प्राप्त करें" का उत्तर है: आपको उन्हें पाठक की जानकारी के आधार पर स्क्रैच से बनाना होगा। दुर्भाग्यवश, प्रदर्शन लाभ की निंदा करता है। एक बार जब आप XmlReader पर स्विच करते हैं, तब तक कुछ अलग-अलग मामलों के लिए, डीओएम दृष्टिकोणों को पूरी तरह से रोकना बेहतर होता है।

इसके अलावा, XPath (SelectNodes जो आप ऊपर दिखाते हैं) का उपयोग करके नोड निकालने का "बहुत आसान" तरीका यहां उपयोग नहीं किया जा सकता है: XPath को एक डोम पेड़ की आवश्यकता होती है। इस दृष्टिकोण को फ़िल्टरिंग दृष्टिकोण पर विचार करें: आप XmlReader में फ़िल्टर जोड़ सकते हैं और कुछ नोड्स को छोड़ने या किसी निश्चित नोड तक पढ़ने के लिए कह सकते हैं। यह बेहद तेज़ है, लेकिन सोचने का एक अलग तरीका है।

4

इस दृष्टिकोण के लिए XmlDocument.ReadNode का उपयोग करें। नाम का उपयोग करने में XmlReader डालें और नामस्थान उपसर्ग को हटाने के लिए नाम के बजाय XmlReader.LocalName का उपयोग करें।

1

मैं एक XmlDocumenht में निम्नलिखित तरीके को जब मैं एक XmlReader से डेटा सम्मिलित करने के लिए मिला है उपयोग किया है:

XmlReader rdr = cmd.ExecuteXmlReader(); 

XmlDocument doc = new XmlDocument(); 

// create a container node for our resultset 
XmlElement root = doc.CreateElement("QueryRoot"); 
doc.AppendChild(root); 

StringBuilder xmlBody = new StringBuilder(); 

while(rdr.Read()) 
{ 
    xmlBody.Append(rdr.ReadOuterXml()); 
} 

root.InnerXml = xmlBody.ToString(); 
12

क्यों सिर्फ निम्नलिखित नहीं?

public static IEnumerable<XmlNode> StreamNodes(
    string path, 
    string[] tagNames) 
{    
    var doc = new XmlDocument();    
    using (XmlReader xr = XmlReader.Create(path)) 
    { 
     xr.MoveToContent(); 
     while (true) { 
      if (xr.NodeType == XmlNodeType.Element && 
       tagNames.Contains(xr.Name)) 
      { 
       var node = doc.ReadNode(xr); 
       yield return node; 
      } 
      else 
      { 
       if (!xr.Read()) 
       { 
        break; 
       } 
      } 
     } 
     xr.Close(); 
    }       
} 
// Used like this: 
foreach (var el in StreamNodes("orders.xml", new string[]{"order"})) 
{ 
    .... 
} 

नोड्स तो आगे की प्रक्रिया के लिए किसी अन्य दस्तावेज़ में आयात किया जा सकता है:

XmlDocument doc = new XmlDocument(); 
XmlNode node = doc.ReadNode(reader); 
+0

' के रूप में पहले से प्राप्त करने के लिए 'doc.ReadNode (पाठक)' का उपयोग कर सकते हैं। Http://stackoverflow.com/questions/1566192/how-to-build-xmlnodes-from-xmlreader/1566333#1566333 देखें। –

+0

यह सही जवाब है क्योंकि दूसरा खाली नोड छोड़ देता है! –

0

यहाँ मेरी दृष्टिकोण है।

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