Antworten:
XmlDocument zum Lesen eines XML aus einer Zeichenfolge oder einer Datei.
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
oder
doc.LoadXml("<xml>something</xml>");
dann finden Sie einen Knoten darunter, dh wie folgt
XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");
oder
foreach(XmlNode node in doc.DocumentElement.ChildNodes){
string text = node.InnerText; //or loop through its children as well
}
Lesen Sie dann den Text in diesem Knoten wie folgt
string text = node.InnerText;
oder lesen Sie ein Attribut
string attr = node.Attributes["theattributename"]?.InnerText
Überprüfen Sie Attribute ["etwas"] immer auf null, da sie null sind, wenn das Attribut nicht vorhanden ist.
XmlNode node = XmlDocument.Docu...
Linie nicht wirklich sein XmlNode = doc.Docu...
? Warum wurde die Antwort geändert und die doc.
entfernt?
// 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);
}
Referenz : LINQ to XML bei MSDN
Hier ist eine Anwendung, die ich zum Lesen von XML-Sitemaps geschrieben habe:
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()
{
}
}
}
Code auf dem Einfügebehälter http://pastebin.com/yK7cSNeY
Es gibt viele Möglichkeiten, einige:
Du kannst entweder:
Beispiele finden Sie auf den bereitgestellten msdn-Seiten
Außerdem bietet VB.NET eine viel bessere Unterstützung für das XML-Parsen über den Compiler als C #. Wenn Sie die Option und den Wunsch haben, probieren Sie es aus.
Sie können ein DataSet zum Lesen von XML-Zeichenfolgen verwenden.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
Posting dies zur Information.
Schauen Sie sich zum Beispiel die XmlTextReader- Klasse an.
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;
}
}
}
Sie können die erste Anweisung vermeiden und einfach den Pfadnamen im Konstruktor von XmlTextReader angeben.
Es gibt verschiedene Möglichkeiten, je nachdem, wo Sie hin möchten. XmlDocument ist leichter als XDocument. Wenn Sie jedoch minimalistisch überprüfen möchten, ob eine Zeichenfolge XML enthält, ist der reguläre Ausdruck möglicherweise die schnellste und leichteste Wahl, die Sie treffen können. Zum Beispiel habe ich Smoke Tests mit SpecFlow für meine API implementiert und möchte testen, ob eines der Ergebnisse in einem gültigen XML vorliegt - dann würde ich einen regulären Ausdruck verwenden. Wenn ich jedoch Werte aus diesem XML extrahieren muss, würde ich es mit XDocument analysieren, um es schneller und mit weniger Code zu erledigen. Oder ich würde XmlDocument verwenden, wenn ich mit einem großen XML arbeiten muss (und manchmal arbeite ich mit XMLs, die ungefähr 1 Million Zeilen umfassen, sogar mehr). dann konnte ich es sogar Zeile für Zeile lesen. Warum? Versuchen Sie, in Visual Studio mehr als 800 MB in privaten Bytes zu öffnen. Selbst in der Produktion sollten Sie keine Objekte haben, die größer als 2 GB sind. Sie können mit einem twerk, aber Sie sollten nicht. Wenn Sie ein Dokument analysieren müssten, das VIELE Zeilen enthält, handelt es sich bei diesen Dokumenten wahrscheinlich um CSV.
Ich habe diesen Kommentar geschrieben, weil ich viele Beispiele mit XDocument sehe. XDocument eignet sich nicht für große Dokumente oder wenn Sie nur überprüfen möchten, ob der Inhalt XML-gültig ist. Wenn Sie überprüfen möchten, ob das XML selbst sinnvoll ist, benötigen Sie Schema.
Ich habe auch die vorgeschlagene Antwort abgelehnt, weil ich glaube, dass sie die oben genannten Informationen in sich selbst benötigt. Stellen Sie sich vor, ich muss überprüfen, ob 200M XML 10-mal pro Stunde gültiges XML ist. XDocument wird eine Menge Ressourcen verschwenden.
prasanna venkatesh gibt außerdem an, dass Sie versuchen könnten, die Zeichenfolge in ein Dataset einzufügen. Dies zeigt auch gültiges XML an.