データベースの目的で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を使用しました
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();
}
}
}
_
XMLファイルを指すようにXDocument.Load()
のパスを調整する必要がありますが、残りは機能するはずです。理解できない部分について質問します。
@Jon Skeetのコメントによると、ファイルが非常に大きい場合にのみXmlReaderを使用する必要があります。使用方法は次のとおりです。 Bookクラスがあると仮定します
public class Book {
public string Title {get; set;}
public string Author {get; set;}
}
次のように、小さなメモリフットプリントでXMLファイルを1行ずつ読み取ることができます。
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);
}
または、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();
}
XMLDocumentクラスのGetElementsByTagNameメソッドを使用して特定のデータを読み込むか、LoadXmlメソッドを使用してすべてのデータをxmlドキュメントに読み込みます。