【问题标题】:XmlDocument.LoadXml() throws an exception of type ComExceptionXmlDocument.LoadXml() 抛出 ComException 类型的异常
【发布时间】:2011-11-30 17:57:03
【问题描述】:

我正在尝试解析从 this link 返回的 xml 文档,但我得到了 ComException 类型的异常,并显示以下消息:

Error HRESULT E_FAIL has been returned from a call to a COM component.

代码如下:

        try
        {
            //...
            string EPGXML = await DownloadAsync(url);

            var xmldoc = new XmlDocument();
            xmldoc.LoadXml(EPGXML); //this line throws the exception
            //...rest of the code
        }
        catch (Exception)
        {
            //I get here...
        }

您能帮我解释一下为什么会收到此消息吗?我该如何解决这个问题?谢谢。

编辑:

我正在使用这个函数读取 XML 的源代码(也许我在这里错了,我应该做一些事情来获取 UTF-8 中的字符串,因为我在调试中看不到字符串中的德语字符模式(观察窗口):

    private async static Task<string> DownloadPageAsync(string url)
    {
        try
        {
            HttpClientHandler handler = new HttpClientHandler();
            handler.UseDefaultCredentials = true;
            handler.AllowAutoRedirect = true;
            handler.UseCookies = true;
            HttpClient client = new HttpClient(handler);
            client.MaxResponseContentBufferSize = 10000000;
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();

            string responseBody = response.Content.ReadAsString();
            return responseBody;
        }
        catch (Exception ex)
        {
            return "error" + ex.Message;
        }
    }

【问题讨论】:

  • 这段代码是否在(非主)线程上运行?
  • 当您使用 .NET 的预发布版本时,最好提及(标记)。
  • 您提供的链接不是有效的 XML,尽管这通常会引发 XmlException。不过,您是否尝试过加载好的 XML?
  • 我在我的 MetroStyle 应用程序的 WinRT 代码中使用它。这段代码在主线程上异步运行。

标签: c# .net xml windows-runtime


【解决方案1】:

您提供的 XML 无效,至少 Firefox 是这样说的:

分析 XML 错误:格式错误 就位:http://www.onlinetvrecorder.com/?aktion=epg_export&format=xml&btn_ok=OK&>stations=3SAT,ANIXE,ARD&from=30.11.2011&to=30.11.2011 Numéro de ligne 218,科隆 193:

(对不起法国人)

仔细看,解析器似乎在“Plötzlich”这个词上,在字符“ö”上中断了。

您应该使用 CDATA 来防止这种情况:

<![CDATA[Your text here can contain special chars]]>

【讨论】:

  • 是的,谢谢,我现在才意识到。那么我怎样才能逃脱无效字符呢?
  • 那么我该如何实现呢?我的意思是添加&lt;![CDATA[
  • 这个xml在你手里吗,我的意思是你是onlinetvrecorder.com先生吗?
  • 我认为最好的办法是预先解析 xml 字符串,在加载 XmlDocument 之前在需要的地方添加 CDATA。
  • 很奇怪的编码。当然不是标题所承诺的 8859-1。
【解决方案2】:

不要尝试使用 html 页面加载 XML 文档。使用Html Agility Pack,这是为了这样做。

编辑:如果您只想将页面的来源作为字符串,这应该可以解决问题。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com/posts/8331002");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string data = string.Empty;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    data = reader.ReadToEnd();

Console.WriteLine(data);

【讨论】:

  • 我正在处理的项目是在 WinRT 上,所以我不能轻松添加对 .Net 程序集的引用。
  • 好的,但我建议不要在 XML 文档上加载 html 仍然适用 :)
  • 您确定不能使用 Html Agility Pack 吗?我怀疑您可以下载源代码,尝试将其编译为 WinRT dll,进行一些小调整,然后您就可以使用 WinRT dll。
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多