it-swarm.dev

Jak čtu a analyzuji soubor XML v jazyce C #?

Jak čtu a analyzuji soubor XML v jazyce C #?

294
Gajendra

XmlDocument pro čtení XML z řetězce nebo ze souboru.

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

nebo

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

pak najít uzel pod ním, jako je tento

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

nebo

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

pak si přečtěte text uvnitř tohoto uzlu

string text = node.InnerText;

nebo číst atribut

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

Vždy zkontrolujte, zda je hodnota Null na atributech ["něco"], protože pokud atribut neexistuje, bude null.

405
Wolf5

LINQ to XML Příklad:

// 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);
}

Reference: LINQ to XML na MSDN

182

Zde je aplikace, kterou jsem napsal (a) pro čtení xml sitemap:

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()
        {
        }
    }
}

Kód na Paste Bin http://Pastebin.com/yK7cSNeY

14
ajzeffer

Existuje spousta možností, některé:

  • XmlSerializer. použijte třídu s cílovým schématem , které chcete číst - použijte XmlSerializer pro získání dat v XML načtené do instance třídy.
  • Linq 2 xml
  • XmlTextReader.
  • XmlDocument
  • XPathDocument (přístup jen pro čtení)
10
eglasius

Můžeš buď:

Příklady jsou uvedeny na poskytnutých stránkách msdn

6
Grzenio

Linq do XML.

Také VB.NET má mnohem lepší podporu analýzy XML prostřednictvím kompilátoru než C #. Pokud máte možnost a touhu, podívejte se na to.

6
Will

DataSet můžete použít ke čtení řetězců XML.

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

Vysílání pro informaci. 

5

Podívejte se na například XmlTextReader class.

2

Existují různé způsoby v závislosti na tom, kde se chcete dostat. XmlDocument je lehčí než XDocument, ale pokud si přejete ověřit minimalisticky, že řetězec obsahuje XML, pak regulární výraz je možná nejrychlejší a nejlehčí volbou, kterou můžete udělat. Například jsem implementoval Smoke Tests s SpecFlow pro mé API a chtěl bych otestovat, zda jeden z výsledků v nějakém platném XML - pak bych použil regulární výraz. Ale pokud potřebuji extrahovat hodnoty z tohoto XML, pak bych ho analyzoval s XDocumentem, abych to udělal rychleji as menším kódem. Nebo bych použil XmlDocument, pokud musím pracovat s velkým XML (a někdy pracuji s XML, které jsou kolem 1M řádků, ještě více); pak jsem si to mohl přečíst i po řádku. Proč? Zkuste otevřít více než 800 MB v soukromých bajtech v aplikaci Visual Studio; ani při výrobě byste neměli mít objekty větší než 2 GB. Můžete s twerkem, ale neměli byste. Pokud byste museli analyzovat dokument, který obsahuje LOT linek, pak by tyto dokumenty byly pravděpodobně CSV. 

Napsal jsem tento komentář, protože vidím mnoho příkladů s XDocumentem. XDocument není vhodný pro velké dokumenty, nebo když chcete pouze ověřit, zda je obsah XML platný. Pokud si přejete zkontrolovat, zda XML má smysl, pak potřebujete Schema.

Také jsem navrhl odpověď, protože jsem přesvědčen, že potřebuje výše uvedené informace uvnitř sebe. Představte si, že je třeba ověřit, zda je 200M XML, desetkrát za hodinu, platné XML. XDocument bude plýtvat zdrojem.

prasanna venkatesh také uvádí, že byste mohli zkusit vyplnit řetězec do datové sady, bude také označovat platné XML. 

0
Nikola
  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;
            }
        }
    }

Prvnímu příkazu se můžete vyhnout a v konstruktoru XmlTextReader zadejte pouze název cesty. 

0
Vishal Kotak