Как читать и анализировать XML файл на С#?
Как читать и анализировать XML файл на С#?
Ответ 1
XmlDocument для чтения XML из строки или из файла.
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
или
doc.LoadXml("<xml>something</xml>");
затем найдите node ниже, т.е., как это
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
}
тогда прочитайте текст внутри node, как этот
string text = node.InnerText;
или прочитать атрибут
string attr = node.Attributes["theattributename"]?.InnerText
Всегда проверяйте значение null на атрибутах [ "something" ], поскольку оно будет null, если атрибут не существует.
Ответ 2
Пример 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 Full Name: {0}", name);
}
Ссылка: LINQ to XML на MSDN
Ответ 3
Здесь приложение, которое я написал для чтения xml sitemaps:
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
Ответ 4
Есть много способов, некоторые:
- XmlSerializer. использовать класс с целевой схемой вы хотите прочитать - используйте XmlSerializer для получения данных в Xml, загруженном в экземпляр класса.
- Linq 2 xml
- XmlTextReader.
- XmlDocument
- XPathDocument (доступ только для чтения)
Ответ 5
Вы также можете:
- Используйте класс XmlSerializer
- Используйте класс XmlDocument
Примеры приведены на страницах MSDN
Ответ 6
Кроме того, VB.NET имеет гораздо лучшую поддержку синтаксического анализа xml через компилятор, чем С#. Если у вас есть опция и желание, проверьте это.
Ответ 7
Вы можете использовать DataSet для чтения XML-строк.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
Проводя это ради информации.
Ответ 8
Посмотрите XmlTextReader класс.
Ответ 9
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.
Ответ 10
Существуют разные способы, в зависимости от того, где вы хотите получить. XmlDocument легче XDocument, но если вы хотите минимально проверить, что строка содержит XML, то регулярное выражение, возможно, является самым быстрым и легким выбором, который вы можете сделать. Например, я применил Smoke Tests с SpecFlow для моего API, и я хочу проверить, есть ли какой-либо из результатов в любом действительном XML - тогда я бы использовал регулярное выражение. Но если мне нужно извлечь значения из этого XML, я бы проанализировал его с помощью XDocument, чтобы сделать это быстрее и с меньшим количеством кода. Или я бы использовал XmlDocument, если мне нужно работать с большим XML (а иногда я работаю с XML, который вокруг 1M строк, даже больше); то я мог бы даже читать его по строкам. Зачем? Попробуйте открыть более 800 МБ в частных байтах в Visual Studio; даже при производстве у вас не должно быть объектов размером более 2 ГБ. Вы можете с помощью twerk, но не должны. Если вам придется разбирать документ, содержащий много строк, то эти документы, вероятно, будут CSV.
Я написал этот комментарий, потому что я вижу множество примеров с XDocument. XDocument не подходит для больших документов или когда вы хотите проверить, действительно ли контент является XML. Если вы хотите проверить, имеет ли смысл XML, вам нужна схема.
Я также отклонил предложенный ответ, потому что я считаю, что он нуждается в вышеуказанной информации внутри себя. Представьте, что мне нужно проверить, является ли 200M XML, 10 раз в час, действительным XML. XDocument будет тратить много ресурсов.
prasanna venkatesh также заявляет, что вы можете попробовать заполнить строку в наборе данных, она также укажет на действительный XML.