我打算将XML用于数据库目的。我唯一能做的就是读取整个XML文件。我希望能够只读取一些数据,但我不知道该怎么做。
这是一个简单的XML
<Books>
<Book>
<Title>Animals</Title>
<Author>J. Anderson</Author>
</Book>
<Book>
<Title>Car</Title>
<Author>L. Sawer</Author>
</Book>
</Books>
我对应用程序的输出感兴趣
Books:
Animals
Cars
Authors:
J. Anderson
L. Sawer
我只想学习如何从XML读取特定数据而不是整个文件。
[解决] 我使用Linq to XML
答案 0 :(得分:47)
我认为你不能“合法地”加载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文件,但其余的应该可以使用。询问有关您不理解哪些部分的问题。
答案 1 :(得分:12)
根据@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<Book> 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);
}
答案 2 :(得分:3)
或者,您可以使用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");
...
/// <summary>
/// Gets the string values.
/// </summary>
/// <param name="description">The description.</param>
/// <param name="navigator">The navigator.</param>
/// <param name="xpath">The xpath.</param>
/// <returns></returns>
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();
}
答案 3 :(得分:1)
尝试使用XMLDocument类的GetElementsByTagName方法读取特定数据或使用LoadXml方法将所有数据读取到xml文档。