Jak čtu a analyzuji soubor XML v jazyce C #?
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.
// 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
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
Existuje spousta možností, některé:
Můžeš buď:
Příklady jsou uvedeny na poskytnutých stránkách msdn
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.
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.
Podívejte se na například XmlTextReader class.
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.
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.