ホストされたWebサイトにメッセージを記録するように設計している単純なクラスがあります。
メッセージを保存するために、次の単純なクラス構造を作成しました。
public class StoredMsg {
public StoredMsg() {
}
public string From { get; set; }
public string Date { get; set; }
public string Message { get; set; }
}
これらのメッセージは、StoredMessages : List<StoredMsg>
クラスを使用して書き込まれ、読み戻されます。
これは、Read
メソッドの元の形式です。
public void Read() {
//string xmlPath = WebPage.Server.MapPath(XML_PATH);
if (File.Exists(xmlPath)) {
using (var xr = new XmlTextReader(xmlPath)) {
StoredMsg item = null;
while (xr.Read()) {
if (xr.NodeType == XmlNodeType.Element) {
if (xr.Name == HEAD) {
if (item != null) {
this.Add(item);
}
item = new StoredMsg();
} else if (xr.Name == FROM) {
item.From = xr.ReadElementString();
} else if (xr.Name == DATE) {
item.Date = xr.ReadElementString();
} else if (xr.Name == MESSAGE) {
item.Message = xr.ReadElementString();
}
}
}
xr.Close();
}
}
}
このWrite
メソッドは、もともと次の形式でした。
public void Write(StoredMsg item) {
using (var stream = File.Open(xmlPath, FileMode.Append, FileAccess.Write, FileShare.Read)) {
using (var xw = new System.Xml.XmlTextWriter(stream, Encoding.UTF8)) {
xw.WriteStartElement(HEAD);
{
xw.WriteWhitespace("\r\n\t");
xw.WriteElementString(FROM, item.From);
xw.WriteWhitespace("\r\n\t");
xw.WriteElementString(DATE, item.Date);
xw.WriteWhitespace("\r\n\t");
xw.WriteElementString(MESSAGE, item.Message);
xw.WriteWhitespace("\r\n");
}
xw.WriteEndElement();
xw.WriteWhitespace("\r\n");
}
stream.Close();
}
}
問題は、このRead
メソッドが XML の構造の一部を気に入らなかったため、リストが常に空だったことです。
ホストされた Web サイトでこれをトラブルシューティングするのは難しいため、オンラインで例を調べて、何が間違っているのかを調べ始めました。
検索中に、Microsoft の How to: Write Object Data to an XML File (C# and Visual Basic)Write
を見つけました。これは、私のメソッドが行ったことを簡素化する簡単な方法を示しています。
private XmlSerializer serializer;
public StoredMessages() {
serializer = new XmlSerializer(typeof(StoredMsg));
}
public void Write(StoredMsg item) {
using (var file = new StreamWriter(xmlPath, true)) {
serializer.Serialize(file, item);
}
}
それは、私にとって、シンプルさとエレガンスです!
これに満足したので、Microsoft の How to: Read Object Data from an XML File (C# and Visual Basic)に進み、それを実装することもできました。
問題は次のとおりです。
私ができる最善の方法は、次のようにメソッドを書くことです。
public void Read() {
if (File.Exists(xmlPath)) {
using (var file = new StreamReader(xmlPath)) {
// How do I handle multiple nodes?
// http://msdn.microsoft.com/en-us/library/vstudio/ms172872.aspx
var item = (StoredMsg)serializer.Deserialize(file);
this.Add(item);
}
}
}
Linq to XML ですべてのアイテムを読み取る方法を誰かが教えてくれるのを見ることに非常に興味があり、そのために +1 を付けますが、ここでの質問は、Read
上記のこの手法を使用してすべてのデータを読み取る方法です。
逆シリアル化されたオブジェクトを他のものではなく誤ってキャストしているというStoredMsg
ことですか? もしそうなら、他の何かは何でしょうか?
StoredMsg[]
?List<object>
?StoredMessages
?
これをすべて読んでくれてありがとう。私のコードが他の人にも読めることを願っています。
他のユーザーが私のメール アドレスを簡単に取得できないように、スクリーンショットとして提供されるデータの例: