尝试反序列化 XML 数组

3

我正在尝试反序列化一个来自第三方网络服务的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代码和一个按钮,我希望它在点击事件上调用这个函数 - 所以我的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)."}

内部异常是:

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

我已经花费了数小时来解决这个问题,但还是摸不着头脑。

1个回答

2

您的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));

我觉得我有点明白你的意思了 - 但是变量stream指的是什么? - Eldorian
@Eldorian 任何流,如FileStream、NetworkStream等。你的response.GetResponseStream()很好。 - L.B
谢谢 - 我已经按照你的建议更改了代码,但在尝试反序列化时仍然遇到相同的错误。 - Eldorian
@Eldorian 我将你的XML复制到一个文件中,并在发布之前测试了上面的代码。它确实有效...我发布了一个自包含的工作代码。只需使用上面的代码,不要将其与您的代码和XML属性混合使用。 - L.B
你的代码起作用了。我找到了我的问题所在。在生产测试中,我运行的 URL 返回为 foobar/ 而不是只有 foobar。我更改了命名空间以反映这一点,然后它就像魔法般地工作了。糟糕!非常感谢你! - Eldorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接