如何读取和parsingC#中的XML文件?

如何读取和parsingC#中的XML文件?

XmlDocument从string或从文件读取XML。

XmlDocument doc = new XmlDocument(); doc.Load("c:\\temp.xml"); 

要么

 doc.LoadXml("<xml>something</xml>"); 

然后find它下面的节点就是这样

 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 

总是在属性[“something”]上检查null,因为如果该属性不存在,它将为空。

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's Full Name: {0}", name); } 

参考 :MSDN上的LINQ to XML

这里是我写的阅读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

有很多方法,一些:

  • XmlSerializer的。 使用具有要读取的目标模式的类 – 使用XmlSerializer将Xml中的数据加载到类的实例中。
  • Linq 2 xml
  • XmlTextReader的。
  • 的XmlDocument
  • XPathDocument(只读访问)

Linq到XML。

另外,VB.NET通过编译器支持比C#更好的xmlparsing支持。 如果你有select和愿望, 检查出来。

你可以:

  • 使用XmlSerializer类
  • 使用XmlDocument类

例子在提供的msdn页面上

例如检查XmlTextReader类。

您可以使用DataSet来读取XMLstring。

 var xmlString = File.ReadAllText(FILE_PATH); var stringReader = new StringReader(xmlString); var dsSet = new DataSet(); dsSet.ReadXml(stringReader); 

为了信息而张贴此信息。

  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的构造函数中指定path名称即可。

有不同的方式,取决于你想得到的地方。 XmlDocument比XDocument轻,但是如果您希望简单地validation一个string是否包含XML,则正则expression式可能是您可以做出的最快,最轻的select。 例如,我已经使用SpecFlow为我的API实施了烟雾testing,我希望testing是否有任何有效的XML中的结果 – 然后我将使用正则expression式。 但是,如果我需要从这个XML中提取值,那么我将使用XDocumentparsing它,以便更快速地执行代码。 或者我会使用XmlDocument,如果我必须使用一个大的XML(有时我使用大约1M行的XML,甚至更多)。 那么我甚至可以逐行阅读。 为什么? 尝试在Visual Studio中打开超过800MB的专用字节; 即使在生产中,也不应该有大于2GB的对象。 你可以用twerk,但你不应该。 如果你将不得不parsing一个文件,其中包含很多行,那么这个文件可能是CSV。

我写了这个评论,因为我看到了很多XDocument的例子。 XDocument不适合大文档,或者当您只想validation内容是否为XML有效时。 如果你想检查XML本身是否有意义,那么你需要Schema。

我也低估了build议的答案,因为我认为它需要上面的信息。 想象一下,我需要validation200M的XML,每小时10次,是否是有效的XML。 XDocument会浪费大量的资源。

prasanna venkatesh也声明你可以尝试填充string到数据集,它也会指示有效的XML。