2013-11-26 40 views
0

我想我的XML文件轉換爲對象的列表。解析XML反對

private void ReadChangelog() 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Changelog)); 
     Changelog changelog = (Changelog)serializer.Deserialize(new StringReader("changelog.xml")); 

     foreach (Release release in changelog.Releases) 
     { 
      string version = release.Version; 
      string date = release.Date; 
      string changes = release.Changes; 
     } 
    } 

這是我的changelog類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

[XmlRoot()] 
public class Changelog 
{ 
    private Release[] releases; 

    public Release[] Releases 
    { 
     get { return releases; } 
     set { releases = value; } 
    } 
} 

public class Release 
{ 
    private string version; 
    private string date; 
    private string changes; 

    [XmlAttribute] 
    public string Version 
    { 
     get { return version; } 
     set { version = value; } 
    } 

    [XmlAttribute] 
    public string Date 
    { 
     get { return date; } 
     set { date = value; } 
    } 

    [XmlAttribute] 
    public string Changes 
    { 
     get { return changes; } 
     set { changes = value; } 
    } 
} 

這是我的XML

<?xml version="1.0" encoding="utf-8" ?> 
<Changelog> 
    <Releases> 
    <Release> 
     <Version>1511</Version> 
     <Date>25-11-2013</Date> 
     <Changes> 
     qzdqzdqzdqzdzdzzqefrsrgsrg 
     </Changes> 
    </Release> 
    <Release> 
     <Version>1510</Version> 
     <Date>25-11-2013</Date> 
     <Changes> 
     Blabqzdzqdqzdqzd 
     </Changes> 
    </Release> 
    <Release> 
    </Releases> 
</Changelog> 

但是當我嘗試運行此我得到一個錯誤

InvalidOperationException異常, xml文檔(1,1)包含錯誤。

我在做什麼錯?

+0

您是否嘗試驗證您的XML http://www.w3schools.com/xml/xml_validator.asp? – Marc

+1

請問您最後一個「發佈」需要更緊密? – Sico

+0

當您使用XML提供版本,日期和更改數據的「元素」時,您已經使用XmlAttribute來裝飾該屬性。可以更改XML以將數據作爲「屬性」放在Release元素上,也可以更改定義Release類的方式。 –

回答

4

new StringReader("changelog.xml")不changelog.xml的內容閱讀。相反,這段代碼會讓你嘗試反序列化字面值'changelog.xml'字符串。我想你想要像new StreamReader("changelog.xml")

1

StringReader從字符串內容創建stream,而不是從給定路徑的文件。改爲用戶StreamReader

Changelog changelog = (Changelog)serializer.Deserialize(new StreamReader("changelog.xml")); 

儘管如此,還有在你的代碼對夫婦更多的錯誤:

  1. 你的文檔使用的元素,和你的類聲明使用XmlAttributeAttribute。它不會一起工作。
  2. 您的文檔不是一個正確的XML文檔。它有一些沒有關閉的元素。