Відповіді:
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, якщо атрибут не існує.
XmlNode node = XmlDocument.Docu...
насправді лінія XmlNode = doc.Docu...
? Чому відповідь змінили та doc.
видалили?
// 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
Ось додаток, який я написав для читання файлів 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
Є багато способів, деякі:
Ви можете:
Приклади є на наданих сторінках msdn
Також VB.NET має набагато кращу підтримку розбору xml через компілятор, ніж C #. Якщо у вас є можливість і бажання, перевірте це.
Ви можете використовувати DataSet для читання рядків XML.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
Опублікуйте це заради інформації.
Перевірте, наприклад, клас XmlTextReader .
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.
Існують різні способи, залежно від того, куди ви хочете потрапити. 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.