मैं C # में XML फ़ाइल कैसे पढ़ूं और पार्स करूं?


जवाबों:


480

XmlDocument स्ट्रिंग या फ़ाइल से XML पढ़ने के लिए।

XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");

या

doc.LoadXml("<xml>something</xml>");

फिर इसके नीचे एक नोड खोजें

XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");

या

foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}

फिर इस तरह उस नोड के अंदर का पाठ पढ़ें

string text = node.InnerText;

या एक विशेषता पढ़ें

string attr = node.Attributes["theattributename"]?.InnerText

हमेशा विशेषताएँ ["कुछ"] पर अशक्त के लिए जाँच करें क्योंकि यह अशक्त होगा यदि विशेषता मौजूद नहीं है।


1
मान्य, लेकिन Linq to XML बहुत अच्छा है।
फिंगलस

3
हालाँकि आप कहते हैं कि यह 'अच्छे' है लेकिन क्या LINQ पर इसे इस तरह से करने का कोई और नुकसान है? व्यक्तिगत रूप से मुझे यह तरीका सबसे सरल लगा, कम से कम मेरी जरूरतों के लिए।
कोलर्स

6
LINQ का उपयोग करना शुरू करने से पहले मैंने यह लिखा था। LINQ अच्छा है और इसमें आसानी से पठनीयता हो सकती है। मैं ज्यादातर इन दिनों खुद LINQ का उपयोग करता हूं। लेकिन कुछ घटकों को पुराने स्टाइल की XML ऑब्जेक्ट्स की आवश्यकता होती है, इसलिए यह अभी भी उपयोग किया जाता है। मैं यहां और LINQ दोनों "पुरानी शैली" को आज़माने की सलाह दूंगा और देखूंगा कि आप क्या फिट हैं।
वुल्फ ५

1
क्या XmlNode node = XmlDocument.Docu...लाइन वास्तव में नहीं होनी चाहिए XmlNode = doc.Docu...? जवाब क्यों बदला गया और doc.हटा दिया गया?
wasatchwizard

सच। मुझे नहीं पता कि मैंने इसे क्यों बदला ... ठीक कर दूंगा।
वुल्फ

217

LINQ to XML उदाहरण:

// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");


// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
            where (int)c.Attribute("id") < 4
            select c.Element("firstName").Value + " " +
                   c.Element("lastName").Value;


foreach (string name in query)
{
    Console.WriteLine("Contact's Full Name: {0}", name);
}

संदर्भ : MSDN पर LINQ to XML


16
XDocument.Parse ( "<xml> कुछ </ एक्सएमएल>"); एक तार के लिए।
वोल्फ 5

2
जिन लोगों को शामिल नहीं किया गया है वे मतलबी हैं, उत्तर के लिए धन्यवाद :)
गेब्रियल गार्सिया

@GabrielGarcia सच है, कभी-कभी शुरुआत करने वाले लापता में फंस जाते हैं जिसमें त्रुटि शामिल है
अनाम

1
प्रासंगिक क्या शामिल हैं?
sayth

18

यहाँ एक आवेदन मैंने xml साइटमैप पढ़ने के लिए लिखा है:

using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter the Location of the file");

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == "loc")
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine("All Done :-)"); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}

कोड पर पेस्ट बिन http://pastebin.com/yK7cSNeY


12

बहुत सारे रास्ते हैं, कुछ:

  • XmlSerializer। लक्ष्य स्कीमा के साथ एक वर्ग का उपयोग करें जिसे आप पढ़ना चाहते हैं - XmlSerializer का उपयोग करके डेटा को Xml में वर्ग की एक आवृत्ति में लोड करने के लिए प्राप्त करें।
  • Linq 2 xml
  • XmlTextReader।
  • XmlDocument
  • XPathDocument (केवल पढ़ने के लिए पहुंच)

2
दरअसल, .NET 2.0 के बाद से सीधे XmlTextReader का उपयोग करने के बजाय XmlReader.Create करें।
जॉन सॉन्डर्स


7

Linq to XML।

इसके अलावा, VB.NET में C # की तुलना में कंपाइलर के माध्यम से बेहतर xml पार्सिंग समर्थन है। यदि आपके पास विकल्प और इच्छा है, तो इसे देखें।


"सब गलत"? सटीक नहीं है, मुझे यह सोचना चाहिए, जब तक कि वह बयान जेस्ट में न हो। ओपी ने कोई जानकारी नहीं दी है। .NET संस्करण के बारे में वह काम करता है।
सेरेब्रस

1
हे, हाँ। यह मजाक में था, लेकिन मैं मजाकिया नहीं हूं, इसलिए मैंने इसे हटा दिया।

7

XML स्ट्रिंग्स को पढ़ने के लिए आप डेटासेट का उपयोग कर सकते हैं।

var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);

जानकारी के लिए इसे पोस्ट करना।


बहुत ठीक! यह एसक्यूएल xml कॉलम और .net से जानकारी साझा करने का सबसे तेज़ तरीका है !!
elle0087

आदर्श तब नहीं होता जब आपके पास कई स्तर होते हैं क्योंकि यह प्रत्येक स्तर को डेटासेट के भीतर अपनी तालिका में रखता है।
लेनी के

इसके लिए अभी भी ठीक है। मुझे लगता है कि यह वास्तव में इस बात पर निर्भर करता है कि आपका डेटा वास्तव में कैसा दिखता है और डेटा कितनी गहरी है कि आप उसके बाद हैं।
user2366842


1
  public void ReadXmlFile()
    {
        string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
        XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    columnNames.Add(reader.Value);
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }
    }

आप पहले कथन से बच सकते हैं और XmlTextReader के निर्माण में पथ का नाम निर्दिष्ट कर सकते हैं।


0

अलग-अलग तरीके हैं, इस पर निर्भर करता है कि आप कहाँ जाना चाहते हैं। XmlDocument XDocument की तुलना में हल्का है, लेकिन यदि आप न्यूनतम सत्यापित करना चाहते हैं कि स्ट्रिंग में XML है, तो नियमित अभिव्यक्ति संभवतः सबसे तेज़ और सबसे हल्का विकल्प है जिसे आप बना सकते हैं। उदाहरण के लिए, मैंने अपने एपीआई के लिए SpecFlow के साथ स्मोक टेस्ट को लागू किया है और मैं परीक्षण करना चाहता हूं कि क्या किसी भी वैध XML में एक परिणाम - तो मैं एक नियमित अभिव्यक्ति का उपयोग करूंगा। लेकिन अगर मुझे इस XML से मान निकालने की ज़रूरत है, तो मैं इसे XDocument के साथ पार्स करने के लिए इसे तेज़ी से और कम कोड के साथ पार्स करूंगा। या अगर मैं एक बड़ी XML के साथ काम करना चाहता हूं, तो मैं XmlDocument का उपयोग करूंगा (और कभी-कभी मैं XML के साथ काम करता हूं जो लगभग 1M लाइनें हैं, और भी अधिक); तब मैं इसे लाइन से लाइन भी पढ़ सकता था। क्यों? विजुअल स्टूडियो में निजी बाइट्स में 800MB से अधिक खोलने का प्रयास करें; उत्पादन पर भी आपके पास 2GB से बड़ी वस्तु नहीं होनी चाहिए। आप एक मरोड़ के साथ कर सकते हैं, लेकिन आपको नहीं करना चाहिए। यदि आपको किसी दस्तावेज़ को पार्स करना होगा, जिसमें ए लॉट ऑफ़ लाइन्स हैं, तो यह दस्तावेज़ शायद सीएसवी होगा।

मैंने यह टिप्पणी इसलिए लिखी है, क्योंकि मुझे XDocument के उदाहरणों का एक बहुत कुछ दिखाई देता है। XDocument बड़े दस्तावेज़ों के लिए अच्छा नहीं है, या जब आप केवल यह सत्यापित करना चाहते हैं कि क्या सामग्री XML वैध है। यदि आप जांचना चाहते हैं कि क्या XML खुद समझ में आता है, तो आपको स्कीमा की जरूरत है।

मैंने सुझाए गए उत्तर को भी अस्वीकार कर दिया, क्योंकि मेरा मानना ​​है कि इसे अपने अंदर उपरोक्त जानकारी की आवश्यकता है। कल्पना कीजिए कि अगर मुझे XML की 200M, एक घंटे में 10 बार, वैध XML की पुष्टि करनी है। XDocument संसाधनों की एक बहुत बर्बाद करेगा।

prasanna venkatesh में यह भी कहा गया है कि आप स्ट्रिंग को किसी डेटासेट में भरने का प्रयास कर सकते हैं, यह वैध XML को भी इंगित करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.