我缺少关于在XML中建模数据的概念。考虑以下XML,它将为我正在编写的应用程序保存一些配置数据。
<?xml version="1.0" encoding="utf-8"?>
<DateGuessConfigValues>
<Players>
<Player Id="1">
<Name>Yusnier Viera</Name>
<Country>Cuba</Country>
</Player>
<Player Id="2">
<Name>Ron White</Name>
<Country>USA</Country>
</Player>
</Players>
<Centuries>
<Century>1900</Century>
<Century>2000</Century>
</Centuries>
</DateGuessConfigValues>
我将此XML存储在名为“DateGuessConfig.xml”的文件中,然后运行以下程序...
using System;
using System.Xml.Linq;
using System.Linq;
class Program
{
public static void Main(String[] args)
{
String strPath = @"C:\XMLExample\DateGuessConfig.xml";
XElement xEle = XElement.Load(strPath);
var query = xEle.Descendants("Centuries").ToList();
foreach (var c in query)
{
Console.WriteLine(c.Element("Century").Value);
}
Console.WriteLine("Press <enter> to continue");
Console.ReadLine();
}
}
我希望我的结果是......
1900
2000
但是我只是
1900
我是否错误地对数据建模?我应该使用属性而不是内部文本?
答案 0 :(得分:2)
query
只有一个元素:Centuries
节点。你需要访问它的后代。因此,在您的示例中,它经历了一次循环并检索到第一个Century
值。
尝试将foreach
替换为:
foreach (var c in query.Descendants("Century"))
{
Console.WriteLine(c.Value);
}
答案 1 :(得分:1)
这可以简化为仅使用Descendants
调用:
foreach (var c in xEle.Descendants("Century"))
{
Console.WriteLine(c.Value);
}
这与仍然运行查询的MikeH的答案略有不同
答案 2 :(得分:1)
您可能希望使用DataTable。见下面的代码。它将使用模式进行编写,因此不必对整数进行解析。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataSet ds = new DataSet("DateGuessConfigValues");
DataTable playerTable = new DataTable("Players");
ds.Tables.Add(playerTable);
DataTable centuriesTable = new DataTable("Centuries");
ds.Tables.Add(centuriesTable);
playerTable.Columns.Add("Id", typeof(int));
playerTable.Columns.Add("Name", typeof(string));
playerTable.Columns.Add("Country", typeof(string));
playerTable.Rows.Add(new object[] {1, "Viera", "Cuba"});
playerTable.Rows.Add(new object[] {2, "Ron White", "USA"});
centuriesTable.Columns.Add("Century", typeof(int));
centuriesTable.Rows.Add(new object[] { 1900});
centuriesTable.Rows.Add(new object[] { 2000});
ds.WriteXml("Filename", XmlWriteMode.WriteSchema);
ds = new DataSet();
ds.ReadXml("Filename");
}
}
}