2014-01-11 56 views
2

我想反序列化一个XML文档,我从第三方Web服务中抽取我无法控制的数据,它们只以XML形式发送数据 - 它看起来像下面这样:尝试反序列化XML数组

<?xml version="1.0" encoding="utf-8"?> 
<GameArray xmlns="http://foo.bar"> 
    <Game> 
    <Id>int</Id> 
    <Title>string</Title> 
    </Game> 
    <Game> 
    <Id>int</Id> 
    <Title>string</Title> 
    </Game> 
</GameArray> 

我有我的课看起来像这样:

public class GamesModel 
    { 
     [XmlArray("GameArray")] 
     [XmlArrayItem("Game")] 
     public List<Game> GameList { get; set; } 

     public GamesModel ToXml() 
     { 
      var request = 
       WebRequest.Create(
        "http://foo.bar/GetGames") as 
       HttpWebRequest; 

      var xRoot = new XmlRootAttribute 
      { 
       ElementName = "GameArray", 
       Namespace = "http://foo.bar", 
       IsNullable = true 
      }; 
      var ser = new XmlSerializer(typeof(GamesModel), xRoot); 


      var response = request.GetResponse(); 
      var result = ser.Deserialize(response.GetResponseStream()); 


      return (GamesModel)result; 
     } 
    } 

    public class Game 
    { 
     [XmlElement("Id")] 
     public int Id { get; set; } 

     [XmlElement("Title")] 
     public string Title{ get; set; } 

    } 

在我控制我有这样的设置:

[HttpGet] 
     public ActionResult GetGames() 
     { 
      var xboxGames = new GamesModel(); 

      return Content(GamesModel.ToXml().ToString(), "text/xml"); 
     } 

然后在我看来,我有一些HTML与我想它来调用这个在click事件的按钮 - 所以我的jQuery看起来像这样

$('.testTag').click(function() { 
    $.ajax({ 
     type: "GET", 
     url: "/Home/GetGames", 
     dataType: "xml/text", 
     success: function(xml) { 
      //dostuff 
     } 
    }); 
}); 

我打的服务器就好上了这一切,但是在我去序列化的行中出现错误。错误是:

{"There is an error in XML document (2, 2)."} 

而且是的InnerException:

{"<GameArray xmlns='http://foo.bar/'> was not expected."} 

我一直在敲打我在这头几个小时试图找出什么,我需要做的。

回答

1

您的xml序列化程序需要一些关于根元素xml命名空间的帮助。

XmlSerializer ser = new XmlSerializer(typeof(Game[]), 
       new XmlRootAttribute("GameArray") { Namespace = "http://foo.bar" }); 
var games = (Game[])ser.Deserialize(stream); 

public class Game 
{ 
    public string Id { set; get; } 
    public string Title { set; get; } 
} 

编辑

string xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<GameArray xmlns=""http://foo.bar""> 
    <Game> 
    <Id>int</Id> 
    <Title>string</Title> 
    </Game> 
    <Game> 
    <Id>int</Id> 
    <Title>string</Title> 
    </Game> 
</GameArray>"; 

XmlSerializer ser = new XmlSerializer(typeof(Game[]), 
             new XmlRootAttribute("GameArray") { Namespace = "http://foo.bar" }); 
var games = (Game[])ser.Deserialize(new StringReader(xml)); 
+0

我想我跟着你一些在这里 - 但究竟是指可变数据流? – Eldorian

+0

@Eldorian任何流,FileStream,NetworkStream等你的'response.GetResponseStream()'很好。 –

+0

谢谢 - 所以我将代码更改为您所建议的内容,并且在尝试反序列化时仍然收到同样的错误 – Eldorian