为什么XDocument.Parse会抛出NotSupportedException异常?

4
我正在尝试使用XDocument.Parse解析XML数据,但它会抛出NotSupportedException异常,就像这个主题中所述:在Windows Phone 7中,XDocument.Parse是否不同?我根据发布的建议更新了我的代码,但还是没有帮助。之前我使用类似但更简单的方法解析RSS,并且那个方法很好用。
public void sList()
        {

            WebClient client = new WebClient();

            client.Encoding = Encoding.UTF8;
            string url = "http://eztv.it";
            Uri u = new Uri(url);
            client.DownloadStringAsync(u);
            client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);


        }

    private void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        try
        {
            string s = e.Result;
            s = cut(s);

            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Ignore;


            XDocument document = null;// XDocument.Parse(s);//Load(s);
            using (XmlReader reader = XmlReader.Create(new StringReader(e.Result), settings))
            {
                document = XDocument.Load(reader); // error thrown here
            }

            // ... rest of code
        }
        catch (Exception ex)
        {
            MessageBox.Show( ex.Message);
        }

    }

    string cut(string s)
    {
        int iod = s.IndexOf("<select name=\"SearchString\">");
        int ido = s.LastIndexOf("</select>");

        s = s.Substring(iod, ido - iod + 9);

        return s;
    }

当我用字符串s代替


//string s = "<select name=\"SearchString\"><option value=\"308\">10 Things I Hate About You</option><option value=\"539\">2 Broke Girls</option></select>";

一切正常,没有抛出异常,那我做错了什么?


2
你是认真地用XML解析器解析HTML吗? - Kugel
不,我不是试图使用XML解析器解析HTML,请再看一遍。 - marcin32
XDocument.Load 是一个 XML 解析器 :) - Ku6opr
但是字符串s仅包含xml有效数据,即使我在某个时候删除了"<?xml version=\"1.0\" encoding=\"UTF-8\"?>",它也可以正常工作。@HenkHolterman通过VS Html Viewer显示e.Result正常,但我刚刚注意到它通过xml viewer显示带有错误的s内容,我真的不知道为什么。 - marcin32
1个回答

6

e.Result中存在像"&"这样的特殊符号。

我刚刚试图使用HttpUtility.HtmlEncode()替换这些符号(除了"<", ">", "\"),然后用XDocument解析它。

更新:

我不想展示我的代码,但你让我没得选择 :)

 string y = "";
 for (int i = 0; i < s.Length; i++)
 {
      if (s[i] == '<' || s[i] == '>' || s[i] == '"')
      {
           y += s[i];
      }
      else
      {
           y += HttpUtility.HtmlEncode(s[i].ToString());
      }
 }
 XDocument document = XDocument.Parse(y);
 var options = (from option in document.Descendants("option")
      select option.Value).ToList();

这段代码在我的WP7上可以正常工作。但请勿将此代码用于html转换。我只是为了测试目的而快速编写它。


不,这并没有帮助,它仍然抛出NotSupportedException异常。也许您在正常的C#应用程序中尝试过这段代码,在非WP7应用程序中它可以正常工作。 - marcin32
哦,我没有注意到那些字符在里面,我只是假设他们不会使用它们。谢谢你的帮助和包容。 - marcin32
只是一个快速的提示。由于在C#中字符串是不可变的,使用StringBuilder可能是更好的选择 :) - letstango

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