如何使用C#将XML数据解析为数组?
<details>
<row>
<var name="Year" value=""2008"" />
<var name="person" value=""10202"" />
</row>
<row>
<var name="Year" value=""2007"" />
<var name="person" value=""11202"" />
</row>
</details>
答案 0 :(得分:4)
从这个例子中,它看起来像你希望得到这个:
var rows = XDocument.Load("filename.xml")
.Root.Elements()
.Select(row => row.Elements()
.ToDictionary(v => v.Attribute("name").Value,
v => v.Attribute("value").Value);
这将创建一个IEnumerable<Dictionary<string, string>>
,其中IEnumerable
中的每个条目都是“行”,内部词典中的每个条目都是“变量”。
如果您希望创建一个更强类型的解决方案,并且可以保证XML结构始终是两个变量,一个名为budgetYear
,一个名为account
,那么这样的东西可以工作:
// Probably needs a better name.
struct YearAndAccount
{
private readonly int budgetYear;
private readonly string accountId;
public int BudgetYear { get { return this.budgetYear; } }
public string AccountId { get { return this.accountId; } }
public YearAndAccount(int budgetYear, string accountId)
{
this.budgetYear = budgetYear;
this.accountId = accountId;
}
}
var rows = XDocument.Load("filename.xml")
.Root.Elements()
.Select(row => new YearAndAccount(
int.Parse(row.Elements().Single(el => el.Attribute("name").Value == "budgetYear")
.Attribute("value").Value),
row.Elements().Single(el => el.Attribute("name").Value == "account")
.Attribute("value").Value));
这将创建IEnumerable<YearAndAccount>
。
强类型解决方案的解析代码非常糟糕,因为您的XML结构非常糟糕;一个更好的结构就像是
<details>
<yearAndAccount>
<budgetYear>2008</budgetYear>
<account>10202</account>
</yearAndAccount>
<yearAndAccount>
<budgetYear>2007</budgetYear>
<account>11202</account>
</yearAndAccount>
</details>
在这种情况下代码只是
var rows = XDocument.Load("filename.xml")
.Root.Elements()
.Select(row => new YearAndAccount(row.Element("budgetYear").Value,
int.Parse(row.Element("account").Value)));
答案 1 :(得分:2)
.Net中的Xml序列化/反序列化可以通过以下方式实现:
答案 2 :(得分:0)
您想要实现的目标称为deserialization - 有很多方法可以实现它。
在.NET框架中,可以很好地控制如何实现这一目标的新类之一是DataContractSerializer
。您可以在链接文档底部的示例中看到它的工作原理示例。
如果没有具体的例子,我可以提供帮助。