从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文档。