Yanıtlar:
Dize veya dosyadan XML okumak için XmlDocument.
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
veya
doc.LoadXml("<xml>something</xml>");
sonra altında bir düğüm bulun yani
XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");
veya
foreach(XmlNode node in doc.DocumentElement.ChildNodes){
string text = node.InnerText; //or loop through its children as well
}
sonra bu düğümün içindeki metni şöyle okuyun
string text = node.InnerText;
veya bir özelliği okuyun
string attr = node.Attributes["theattributename"]?.InnerText
Öznitelik yoksa, "[bir şey"] için her zaman null olup olmadığını kontrol edin.
XmlNode node = XmlDocument.Docu...
çizgi gerçekten olmak XmlNode = doc.Docu...
? Yanıt neden değiştirildi ve doc.
kaldırıldı?
// 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);
}
Referans : MSDN'de LINQ'dan XML'e
İşte xml site haritalarını okumak için yazdığım bir uygulama:
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()
{
}
}
}
Yapıştırma Kutusundaki Kod http://pastebin.com/yK7cSNeY
Çok yol var, bazıları:
Şunlardan birini yapabilirsiniz:
Örnekler sağlanan msdn sayfalarındadır
XML dizelerini okumak için bir DataSet kullanabilirsiniz.
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
Bunu bilgi uğruna yayınlamak.
Örneğin , XmlTextReader sınıfına bakın.
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;
}
}
}
İlk ifadeden kaçınabilir ve yalnızca XmlTextReader yapıcısında yol adını belirtebilirsiniz.
Nereden almak istediğinize bağlı olarak farklı yollar vardır. XmlDocument XDocument'ten daha hafiftir, ancak bir dizenin XML içerdiğini minimalist olarak doğrulamak istiyorsanız, normal ifade muhtemelen yapabileceğiniz en hızlı ve en hafif seçimdir. Örneğin, API'm için SpecFlow ile Duman Testleri uyguladım ve herhangi bir geçerli XML'deki sonuçlardan birinin olup olmadığını test etmek istiyorum - o zaman normal bir ifade kullanırım. Ama ben bu XML değerleri ayıklamak gerekirse, o zaman daha hızlı ve daha az kod ile yapmak için XDocument ile ayrıştırmak istiyorum. Ya da ben büyük bir XML ile çalışmak zorunda XmlDocument kullanırdım (ve bazen daha 1M hatları, hatta daha fazla XML ile çalışır); hatta satır satır okuyabiliyordum. Neden? Visual Studio'da özel baytlarda 800MB'den fazla açmayı deneyin; üretimde bile 2GB'tan büyük nesneleriniz olmamalıdır. Bir twerk ile yapabilirsiniz, ama yapmamalısınız. Çok satır içeren bir belgeyi ayrıştırmanız gerekirse, bu belgeler muhtemelen CSV olacaktır.
Bu yorumu yazdım, çünkü XDocument ile bir sürü örnek görüyorum. XDocument, büyük belgeler için iyi değildir veya yalnızca içeriğin XML geçerli olup olmadığını doğrulamak istediğinizde. XML'in mantıklı olup olmadığını kontrol etmek istiyorsanız, Şemaya ihtiyacınız vardır.
Ayrıca önerilen cevabı da düşürdüm, çünkü kendi içinde yukarıdaki bilgilere ihtiyaç duyduğuna inanıyorum. Saatte 10 kez 200M XML'in geçerli XML olup olmadığını doğrulamam gerektiğini düşünelim. XDocument bir sürü kaynağı boşa harcar.
prasanna venkatesh ayrıca dizeyi bir veri kümesine doldurmayı deneyebileceğinizi, geçerli XML'yi de göstereceğini belirtir.