こんにちは私はこのようなxmlドキュメントを持っています:
<Students>
<student name="A" class="1"/>
<student name="B"class="2"/>
<student name="c" class="3"/>
</Students>
XmlReader
を使用してこのxmlを読み、学生のリストをList<student>
として返します。私はこれが次のように達成できることを知っています:
List<Student> students = new List<Student>();
XmlReader reader = XmlReader.Create("AppManifest.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "student")
{
students.Add(new Student()
{
Name = reader.GetAttribute("name"),
Class = reader.GetAttribute("Class")
});
}
}
これに対するより良い解決策があるかどうか知りたいだけですか?
私はSilverlight4を使用しています。xml構造は静的です。 Students
ノードは1つだけで、上記の属性を持つすべての学生ノードはそこにのみ存在します。
絶対に-LINQtoXMLを使用してください。それはsoはるかに簡単です:
XDocument doc = XDocument.Load("AppManifest.xml");
var students = doc.Root
.Elements("student")
.Select(x => new Student {
Name = (string) x.Attribute("name"),
Class = (string) x.Attribute("class")
})
.ToList();
XmlReader
は比較的低レベルのタイプです-本当にできない一度にXML全体をメモリにスラップする余裕がない限り、私はそれを避けます。それでも、ドキュメントのサブツリーだけが必要な場合は、LINQ toXMLをXmlReader
と組み合わせて使用する方法があります。
Linq xmlを使用すると、はるかに簡単になります。
var xDoc = XDocument.Load("AppManifest.xml");
var students =
xDoc.Root.Elements("student")
.Select(n =>
new Student
{
Name = (string)n.Attribute("name"),
Class = (string)n.Attribute("class"),
})
.ToList();
List<Student> students = (from student in doc.Element("Students").Elements("student")
select new Student {
Name = student.Attribute("name"),
Class = student.Attribute("class") }
).ToList();
以下のリンクを参照してください。
http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html
XmlReader
はSilverlightでサポートされています( http://msdn.Microsoft.com/en-us/library/cc189001(v = vs.95).aspx )
XmlReader
のようなSQLDataReader
は基本的にキャッシュされていないモデルであるため、パフォーマンス指向ですが、それを使用して移動できるのは「進む」のみです。
あなたはそのように使うことができます:
protected void Page_Load(object sender, EventArgs e)
{
XmlTextReader reader = new XmlTextReader(Server.MapPath("~/XML"));
while(reader.Read())
{
switch(reader.NodeType)
{
case XmlNodeType.Element:
var lbl = new Label();
lbl.Text=(reader.Name + " -> " );
break;
case XmlNodeType.Text:
Response.Write(reader.Value + "<br />");
break;
case XmlNodeType.EndElement:
Response.Write("</" + reader.Name + ">");
break;
}
}
}