在x#中将xml数据解析为数组

时间:2010-12-19 18:36:08

标签: c# xml arrays

如何使用C#将XML数据解析为数组?

<details> 
 <row> 
  <var name="Year" value="&quot;2008&quot;" /> 
  <var name="person" value="&quot;10202&quot;" /> 
 </row> 
 <row> 
  <var name="Year" value="&quot;2007&quot;" /> 
  <var name="person" value="&quot;11202&quot;" /> 
 </row> 
</details> 

3 个答案:

答案 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序列化/反序列化可以通过以下方式实现:

  1. XmlSerializer和System.Xml.Serialization命名空间中的Xml *属性
  2. DataContactSerializer和DataContract + DataMember属性
  3. XmlReaderXmlWriter + Linq - 处理原始xml文件。

答案 2 :(得分:0)

您想要实现的目标称为deserialization - 有很多方法可以实现它。

在.NET框架中,可以很好地控制如何实现这一目标的新类之一是DataContractSerializer。您可以在链接文档底部的示例中看到它的工作原理示例。

如果没有具体的例子,我可以提供帮助。