从XML读取数据

我打算将XML用于数据库目的。 我唯一能做的就是读取整个XML文件。 我希望能够只读取一些数据而且我不知道该怎么做。

这是一个简单的XML

  Animals J. Anderson   Car L. Sawer   

我对应用程序的输出感兴趣

 Books: Animals Cars Authors: J. Anderson L. Sawer 

我只想学习如何从XML读取特定数据而不是整个文件。

[已解决]我已将Linq用于XML

我不认为你可以“合法地”加载XML文件的一部分,因为那时它会格式不正确(某处会有一个缺少的关闭元素)。

使用LINQ-to-XML,您可以执行var doc = XDocument.Load("yourfilepath") 。 从那里只需要查询你想要的数据,就像这样说:

 var authors = doc.Root.Elements().Select( x => x.Element("Author") ); 

HTH。

编辑:

好的,只是为了让它成为更好的样本,试试这个(使用@ JWL_建议的改进):

 using System; using System.Xml.Linq; namespace ConsoleApplication1 { class Program { static void Main( string[] args ) { XDocument doc = XDocument.Load( "XMLFile1.xml" ); var authors = doc.Descendants( "Author" ); foreach ( var author in authors ) { Console.WriteLine( author.Value ); } Console.ReadLine(); } } } 

您需要在XDocument.Load()调整路径以指向您的XML文件,但其余的应该可以工作。 询问有关您不理解哪些部分的问题。

根据@Jon Skeet的评论,只有当你的文件很大时才应该使用XmlReader。 以下是如何使用它。 假设你有一个Book类

 public class Book { public string Title {get; set;} public string Author {get; set;} } 

你可以逐行读取XML文件,内存占用空间很小,如下所示:

 public static class XmlHelper { public static IEnumerable StreamBooks(string uri) { using (XmlReader reader = XmlReader.Create(uri)) { string title = null; string author = null; reader.MoveToContent(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Book") { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Title") { title = reader.ReadString(); break; } } while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Author") { author =reader.ReadString(); break; } } yield return new Book() {Title = title, Author = author}; } } } } 

用法示例:

 string uri = @"c:\test.xml"; // your big XML file foreach (var book in XmlHelper.StreamBooks(uri)) { Console.WriteLine("Title, Author: {0}, {1}", book.Title, book.Author); } 

或者,您可以使用XPathNavigator:

 XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); XPathNavigator navigator = doc.CreateNavigator(); string books = GetStringValues("Books: ", navigator, "//Book/Title"); string authors = GetStringValues("Authors: ", navigator, "//Book/Author"); 

..

 ///  /// Gets the string values. ///  /// The description. /// The navigator. /// The xpath. ///  private static string GetStringValues(string description, XPathNavigator navigator, string xpath) { StringBuilder sb = new StringBuilder(); sb.Append(description); XPathNodeIterator bookNodesIterator = navigator.Select(xpath); while (bookNodesIterator.MoveNext()) sb.Append(string.Format("{0} ", bookNodesIterator.Current.Value)); return sb.ToString(); } 

尝试使用XMLDocument类的GetElementsByTagName方法读取特定数据或使用LoadXml方法将所有数据读取到xml文档。