NotSupportedException при попытке разобрать plist документ - PullRequest
0 голосов
/ 02 августа 2011

В настоящее время я работаю над приложением Windows Phone 7 для компании, в которой я работаю. Для части конфигурации я хотел бы поделиться конфигурацией, которая используется для нашего приложения iPhone и хранится на удаленном сервере в файле plist.

Я использую System.Xml.Linq.XDocument - Parse строку, которую я скачал с использованием экземпляра WebClient.

Это код:

        Uri plistLocation = new 
            Uri(@"http://iphonevnreporter.vol.at/Settings.bundle/mw_test.plist");
        WebClient client = new WebClient();

        try
        {
            client.DownloadStringCompleted += ((sender,e) => {
                if (e.Error == null)
                {
                    XDocument xdoc = XDocument.Parse(e.Result);

                    //XElement element = XElement.Parse(e.Result.ToString());
                    var dictItems = xdoc.Descendants("dict");
                    foreach (XElement elem in dictItems)
                    {
                    }
                }
            });
        }
        catch (Exception e)
        {
        }
        client.DownloadStringAsync(plistLocation);

В этом примере у plist просто есть элемент dict под корневым элементом plist, и тем не менее я получаю NotSupportedException. Исключение происходит в XDocument.Parse(e.Result).

Это StackTrace:

   at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl()
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Linq.XDeclaration..ctor(XmlReader r)
   at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
   at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options)
   at System.Xml.Linq.XDocument.Parse(String text)
   at VorarlbergOnline.MainViewModel.<FillSections>b__10(
                 Object sender, DownloadStringCompletedEventArgs e)
   at System.Net.WebClient.OnDownloadStringCompleted
            (DownloadStringCompletedEventArgs     e)
   at System.Net.WebClient.DownloadStringOperationCompleted(Object arg)
   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext 
        executionContext,     ContextCallback callback, Object state)
   at System.Threading.ThreadPool.WorkItem.doWork(Object o)
   at System.Threading.Timer.ring()

Загрузка других файлов XML работает нормально, поэтому код выглядит нормально. Я проверил, может ли быть проблема с dtd, на который ссылаются, но он загружается нормально. Так что у меня сейчас немного идей.

Ответы [ 2 ]

5 голосов
/ 02 августа 2011

Хорошо, теперь я на самом деле посмотрел на файл в сыром виде, а не через браузер, я уверен, что это проблема:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

Похоже, что синтаксический анализ doctype просто не поддерживается в Windows Phone 7. Вы можете сделать быстрый и грязный хак, чтобы удалить его:

string xml = e.Result;
int docTypeIndex = xml.IndexOf("<!DOCTYPE");
if (docTypeIndex != -1)
{
    int docTypeEnd = xml.IndexOf(">", docTypeIndex);
    // TODO: Decide what to do if docTypeEnd is -1...
    xml = xml.Substring(0, docTypeIndex) + xml.Substring(docTypeEnd + 1);
}
4 голосов
/ 02 августа 2011

Проблема действительно в DOCTYPE, который не может быть проанализирован XDocument на Windows Phone.Более короткое решение - использовать Regex для удаления ссылки DOCTYPE:

string replaced = Regex.Replace(e.Result, "<!DOCTYPE.+?>", string.Empty);
XDocument.Parse(replaced);
...