2016-05-30 2 views
0

私はAPIを呼び出すWPFアプリケーションがあり、XDocument.Parse(string)を使用してSystem.Xml.Linq.XDocumentを作成しています。私はこれをやろうとするとXmlException( "ルート要素が見つからない")という問題が発生していますが、XMLは完全に有効です。ブラウザでAPIを呼び出し、構文をチェックし、アプリケーションでAPIを呼び出し、応答を受け取って、さまざまなXML構文バリデーター(すべてエラーを返さなかった)を使用して構文チェックを試みました。
APIからのサンプルXML応答は次のとおりです。有効なXMLを解析するときのXmlException

<?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))); 
} 

ですが、なぜでしょうか? XMLは、それがその例外をスローしないと有効であった場合

+0

に動作します。どのように "構文チェック"をやっていますか? – Crowcoder

+0

@Crowcoderすべてのタグが閉じられ、すべての引用符が閉じられ、予約文字が使用されていないことを確認するために、フォーマットを注意深くチェックします。私は[W3SchoolのXML Validator](http://www.w3schools.com/xml/xml_validator.asp)も使用しました。 –

+0

通常、このエラーは "<?xml"がデータの最初の文字でない場合に発生します。通常、最初のスペースまたは余分な文字がこのエラーの原因になります。 – jdweng

答えて

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; 
     } 

    } 
} 
+0

私は自分自身で 'FromXml'の実装が非常に奇妙で、やや愚かなので、これを解決策として受け入れています。私はあなたのものに似たように動作するように書き直しましたが、今はすべてうまく動作しています。 –

+0

最初のエラーは、xmlから識別行を削除したlinqクエリで 'Root'を使用したためです。私はすぐにそのエラーに気づいたが、あなたのXML linqクエリは正しく見えなかったので、私は両方の問題を修正することに決めた。 – jdweng

関連する問題