解析有效XML时出现XmlException

时间:2016-05-30 14:41:54

标签: c# xml wpf linq-to-xml xmlexception

我有一个WPF应用程序,它调用API并使用System.Xml.Linq.XDocument创建XDocument.Parse(string)。我遇到了一个问题,当我尝试这样做时会抛出XmlException(“根元素缺失”),但我的XML完全有效。我尝试通过在浏览器中调用API并检查其语法,在我的应用程序中调用API并Console.WriteLine响应,并使用各种XML语法验证器(所有这些都没有返回错误)来检查语法。<登记/> API的示例XML响应如下:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <event title="Event 1" id="75823347" icon="www.example.com/images/event1-icon.png" uri="www.example.com/rsvp/event1" mode="none" price="10.00" cover="www.example.com/event1-cover.png" enddate="2016-06-01 14:00:00" startdate="2016-06-01 12:00:00" address="1 Example St, Example City State 12345" location="Example Place" description="This is an event" shortdescription="This is an event" theme="auto" color="#FF000000"/>
</response>

这是我的应用程序代码:

public static WebRequest CreateRequest(string baseUrl, string httpMethod, Dictionary<string, string> requestValues) {
    var requestItems = requestValues == null ? null : requestValues.Select(pair => string.Format("&{0}={1}", pair.Key, pair.Value));
    var requestString = "";
    if (requestItems != null)
        foreach (var s in requestItems)
            requestString += s;
    var request = WebRequest.CreateHttp(baseUrl + CredentialRequestString + requestString);
    request.Method = httpMethod.ToUpper();
    request.ContentType = "application/x-www-form-urlencoded";
    request.Credentials = CredentialCache.DefaultCredentials;
    return request;
}

public static WebRequest CreateRequest(string apiEndpoint, string endpointParam, int apiVersion, string httpMethod, Dictionary<string, string> requestValues) {
    return CreateRequest(string.Format("http://www.example.com/api/v{0}/{1}/{2}", apiVersion, apiEndpoint, endpointParam), httpMethod, requestValues);
}

public static async Task<string> GetResponseFromServer(WebRequest request) {
    string s;
    using (var response = await request.GetResponseAsync()) {
        using (var responseStream = response.GetResponseStream()) {
            using (var streamReader = new StreamReader(responseStream)) {
                s = streamReader.ReadToEnd();
            }
        }
    }
    return s;
}

public static async Task<List<Event>> GetEvents() {
    var response = await GetResponseFromServer(CreateRequest("events", "", 1, "GET", null));
    Console.WriteLine(response); //validation
    var data = XDocument.Parse(response).Root; //XmlException: Root element is mising
    return new List<Event>(data.Elements("event").Select(e => Event.FromXml(e.Value)));
}

为什么会这样?

1 个答案:

答案 0 :(得分:1)

以下代码可以使用

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            var data = XDocument.Load(FILENAME); 
            Event _event = Event.FromXml(data.Descendants("event").FirstOrDefault());
        }
    }
    public class Event
    {
        public string title { get ; set; }
        public string icon  {get; set; }
        public string uri  { get; set; }
        public string mode { get;set; }
        public decimal price { get; set; }
        public string cover { get; set; }
        public DateTime enddate { get; set; }
        public DateTime startdate { get; set; }
        public string address { get; set; }
        public string location { get; set; }
        public string description { get; set; }
        public string shortdescription { get; set; }
        public string theme { get; set; }
        public uint color { get; set; }


        public static Event FromXml(XElement data)
        {
            Event _event = new Event();

            _event.title = (string)data.Attribute("title");
            _event.icon = (string)data.Attribute("icon");
            _event.uri = (string)data.Attribute("uri");
            _event.mode = (string)data.Attribute("mode");
            _event.price = (decimal)data.Attribute("price");
            _event.cover = (string)data.Attribute("cover");
            _event.enddate = (DateTime)data.Attribute("enddate");
            _event.startdate = (DateTime)data.Attribute("startdate");
            _event.address = (string)data.Attribute("address");
            _event.location = (string)data.Attribute("location");
            _event.description = (string)data.Attribute("description");
            _event.shortdescription = (string)data.Attribute("shortdescription");
            _event.theme = (string)data.Attribute("theme");
            _event.color = uint.Parse(data.Attribute("color").Value.Substring(1), System.Globalization.NumberStyles.HexNumber) ;

            return _event;
        }

    }
}