Как мне прочитать и разобрать файл XML в C #?

363

Как мне прочитать и разобрать файл XML в C #?

Гаджендра
источник
2
Самое простое решение - использовать LINQ to 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

Всегда проверяйте наличие нулевого значения в атрибутах ["что-то"], поскольку оно будет нулевым, если атрибут не существует.

Wolf5
источник
1
Допустимо, но Linq to XML намного приятнее.
Финглас
3
Хотя вы говорите, что это «лучше», есть ли другой недостаток, если вы сделаете это таким образом по сравнению с LINQ? Лично я нашел этот метод наиболее простым, по крайней мере, для моих нужд.
Kolors
6
Я написал это до того, как начал использовать LINQ. LINQ хорош и может быть легче читаемым. Я в основном использую LINQ сам в эти дни. Но некоторые компоненты действительно нуждаются в объектах XML старого стиля, поэтому он все еще используется время от времени. Я бы порекомендовал попробовать и «старый стиль» здесь, и LINQ и посмотреть, что вам подходит.
Wolf5
1
Разве XmlNode node = XmlDocument.Docu...линия не должна быть на самом деле XmlNode = doc.Docu...? Почему ответ был изменен и doc.удален?
wasatchwizard
Правда. Я понятия не имею, почему я изменил это ... Исправлю.
Wolf5
220

Пример 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);
}

Ссылка : LINQ to XML на MSDN

Константин Таркус
источник
16
XDocument.Parse ( "<XML> что - то </ XML>"); для строки.
Wolf5
2
Люди, которые не включают в себя, являются подлыми, спасибо за ответ, хотя :)
Габриэль Гарсия
@GabrielGarcia правда, иногда новичок застревает в ошибке отсутствующего включения
Аноним
1
Какие соответствующие включает в себя?
скажем
18

Вот приложение, которое я написал для чтения файлов Sitemap 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

ajzeffer
источник
12

Есть много способов, некоторые:

  • XmlSerializer. используйте класс с целевой схемой, которую вы хотите прочитать - используйте XmlSerializer для загрузки данных в Xml, загруженных в экземпляр класса.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (доступ только для чтения)
eglasius
источник
2
На самом деле, XmlReader.Create вместо непосредственного использования XmlTextReader, начиная с .NET 2.0.
Джон Сондерс
7

Linq to XML.

Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа XML через компилятор, чем C #. Если у вас есть выбор и желание, проверьте его.


источник
"Все неправильно"? Я думаю, что это не совсем точно, если только это утверждение не шутит. ОП не предоставил никакой информации. о версии .NET, над которой он работает.
Cerebrus
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
Не идеально, если у вас есть несколько уровней, поскольку каждый уровень помещается в отдельную таблицу в наборе данных.
Lenny K
Это все еще хорошо для этого даже. Я полагаю, что это действительно зависит от того, как на самом деле выглядят ваши данные, и от того, сколько слоев данных вы ищете.
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.

nkalfov
источник