Як прочитати та розібрати XML-файл у C #?


Відповіді:


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

Завжди перевіряйте наявність null на атрибутах ["something"], оскільки це буде null, якщо атрибут не існує.


1
Дійсно, але Linq до XML набагато приємніше.
Finglas

3
Хоча ви кажете, що це «приємніше», чи є ще якийсь недолік зробити це так через LINQ? Особисто я вважав цей метод найбільш простим, принаймні для моїх потреб.
Колорс

6
Я писав це ще до того, як почав використовувати LINQ. LINQ є приємним і може полегшити читабельність. В основному я сам зараз використовую LINQ. Але для деяких компонентів потрібні XML-об'єкти старого стилю, тому вони все ще звикають. Я рекомендую спробувати тут "старий стиль" та LINQ і подивитися, що вам підходить.
Вовк5

1
Чи не повинна XmlNode node = XmlDocument.Docu...насправді лінія XmlNode = doc.Docu...? Чому відповідь змінили та doc.видалили?
wasatchwizard

Правда. Я поняття не маю, чому я це змінив ... Виправимо.
Wolf5

217

Приклад LINQ до 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);
}

Довідка : LINQ до XML на MSDN


16
XDocument.Parse ("<xml> щось </xml>"); для струни
Wolf5

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
Власне, XmlReader.Create замість використання XmlTextReader безпосередньо, оскільки .NET 2.0.
Джон Сондерс


7

Linq - XML.

Також VB.NET має набагато кращу підтримку розбору xml через компілятор, ніж C #. Якщо у вас є можливість і бажання, перевірте це.


"Все неправильно"? Не точно, я думаю, якщо це твердження не було жартом. ОП не надала жодної інформації. про версію .NET, над якою він працює.
Церебрус

1
Хе, так. Це було на жарт, але мені не смішно, тому я його зняв.

7

Ви можете використовувати DataSet для читання рядків XML.

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

Опублікуйте це заради інформації.


дуже добре! це найшвидший спосіб, який я знайшов, щоб поділитися інформацією з sql 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, регулярне вираження, можливо, є найшвидшим і легшим вибором, який ви можете зробити. Наприклад, я реалізував Smoke Tests з SpecFlow для свого API і хочу перевірити, чи є один з результатів у будь-якому дійсному XML - тоді я використовував би регулярний вираз. Але якщо мені потрібно витягнути значення з цього XML, я б розібрав його з XDocument, щоб зробити це швидше і з меншим кодом. Або я б використав XmlDocument, якщо мені доведеться працювати з великим XML (а іноді я працюю з XML, які мають близько 1М рядків, навіть більше); тоді я навіть міг прочитати це за рядком. Чому? Спробуйте відкрити більше 800 Мб в приватних байтах у Visual Studio; навіть на виробництві у вас не повинно бути предметів більше 2 Гб. Можна з твірком, але не слід. Якщо вам доведеться розібрати документ, який містить багато рядків, то, ймовірно, ці документи будуть CSV.

Я написав цей коментар, оскільки бачу безліч прикладів з XDocument. XDocument не є корисним для великих документів, або коли ви хочете лише перевірити, чи є вміст XML дійсним. Якщо ви хочете перевірити, чи має сенс сам XML, тоді вам потрібна схема.

Я також відмовився від запропонованої відповіді, тому що я вважаю, що вона потребує вищевказаної інформації всередині себе. Уявіть, що мені потрібно перевірити, чи 200M XML, 10 разів на годину, є дійсним XML. XDocument витратить чимало ресурсів.

prasanna venkatesh також заявляє, що ви можете спробувати заповнити рядок до набору даних, він також вкаже дійсний XML.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.