System.Xml.XmlException:在给定的编码字符无效。 8271线位置163(S

2019-10-19 04:28发布

我写一个简单的XML解析器这将通过这个XML输出: http://www.cpalead.com/dashboard/reports/campaign_rss.php?id=187000

完整的C#代码为:

    protected void LoadXML()
    {
        XDocument ourBlog = XDocument.Load("http://www.cpalead.com/dashboard/reports/campaign_rss.php?id=187000");
        ourBlog.Declaration.Encoding = "ISO-8859-1";
        XNamespace NameSpace = "http://www.cpalead.com/feeds/campinfo.php";
        var XMLItem = from item in ourBlog.Descendants("item")
                      select new
                      {
                          title = item.Element("title").Value,
                          link = item.Element("link").Value,
                          guid = item.Element("guid").Value,
                          description = item.Element("description").Value,
                          campinfoamount = item.Element(NameSpace + "amount").Value,
                          campinfocampid = item.Element(NameSpace + "campid").Value,
                          campinfocountry = item.Element(NameSpace + "country").Value,
                          campnfotype = item.Element(NameSpace + "type").Value,
                          campinfoepc = item.Element(NameSpace + "epc").Value,
                          campinforatio = item.Element(NameSpace + "ratio").Value
                      };

        foreach (var item in XMLItem)
        {
            offers.InnerHtml += item.title + item.campinforatio + "<br>";
        }

    }

提供是一个div元素。 当我运行此代码,我得到一个“System.Xml.XmlException:无效字符在给定的编码8271线,位置163” 错误正如你可以看到我也用ourBlog.Declaration.Encoding =“”集编码; 我努力了:

  • ISO-8859-1
  • UTF-8
  • 窗户-1251
  • 窗口1252
  • UTF-16

我不知道什么尝试。 你有什么建议吗?

编辑:

堆栈跟踪:

源错误:

Line 19:         protected void LoadXML()
Line 20:         {
Line 21:             XDocument ourBlog = XDocument.Load("http://www.cpalead.com/dashboard/reports/campaign_rss.php?id=187000");
Line 22:             ourBlog.Declaration.Encoding = "ISO-8859-1";
Line 23:             XNamespace NameSpace = "http://www.cpalead.com/feeds/campinfo.php";

堆栈跟踪:

[XmlException: Invalid character in the given encoding. Line 8271, position 163.]
System.Xml.XmlTextReaderImpl.Throw(Exception e) +69
System.Xml.XmlTextReaderImpl.Throw(String res, String arg) +116
System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount) +197
System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount) +131
System.Xml.XmlTextReaderImpl.ReadData() +188
System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) +482
System.Xml.XmlTextReaderImpl.FinishPartialValue() +62
System.Xml.XmlTextReaderImpl.get_Value() +74
System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) +505
System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) +48
System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) +283
System.Xml.Linq.XDocument.Load(String uri, LoadOptions options) +58
System.Xml.Linq.XDocument.Load(String uri) +6
WebApplication3.Earn._default.LoadXML() in c:\Users\WinDrop\Documents\Visual Studio 2013\Projects\WebApplication3\WebApplication3\Earn\default.aspx.cs:21
WebApplication3.Earn._default.Page_Load(Object sender, EventArgs e) in c:\Users\WinDrop\Documents\Visual Studio 2013\Projects\WebApplication3\WebApplication3\Earn\default.aspx.cs:16
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

Answer 1:

好吧,我已经在这里找到了一个可行的解决方案。

下面是新的代码:

protected void LoadXML()
    {
        var wc = new WebClient();
        using (var sourceStream = wc.OpenRead("http://www.cpalead.com/dashboard/reports/campaign_rss.php?id=187000"))
        {
            using (var reader = new StreamReader(sourceStream))
            {
                XDocument ourBlog = XDocument.Load(reader);
                XNamespace NameSpace = "http://www.cpalead.com/feeds/campinfo.php";
                var XMLItem = from item in ourBlog.Descendants("item")
                              select new
                              {
                                  title = item.Element("title").Value,
                                  link = item.Element("link").Value,
                                  guid = item.Element("guid").Value,
                                  description = XmlConvert.VerifyXmlChars(item.Element("description").Value),
                                  amount = item.Element(NameSpace + "amount").Value,
                                  campid = item.Element(NameSpace + "campid").Value,
                                  country = item.Element(NameSpace + "country").Value,
                                  type = item.Element(NameSpace + "type").Value,
                                  epc = item.Element(NameSpace + "epc").Value,
                                  ratio = item.Element(NameSpace + "ratio").Value
                              };

                foreach (var item in XMLItem)
                {
                    offers.InnerHtml += item.title + " : " + item.description + " : " + item.amount + "<br />"; 
                }
            }
        }
    }

希望这会帮助别人,将来别人。



Answer 2:

你的XML文件确实是无效的。 它的编码显然是UTF-8。 但是,有上线8271的一个问题。

该生产线基本上是这样的:

    <description>eMusic δίνει οπαδούς μουσικής της φανταστική συναλλάσσεται για μεγάλη μουσική, κατά μέσο όρο περίπου τα μισά από Amazon ή το iTunes κατάστημα. Έναρξ_</description>

但关闭标签,我把下划线权之前,该数据似乎在UTF-8多字节字符的中间被切断。 在十六进制,它看起来是这样的:

CF 81 EC BE EC 3C 64 65 2F

CF 81 CE BE是希腊字母ρξ ,3C 2F 64 65 </de 。 但剩下的CE开始是被切断的多字节序列。 该值在255个字节切断!

您需要修改的源文件。 这是无效的。 而255个字节是不是在IT随机长度。 也许更多的数据丢失。



文章来源: System.Xml.XmlException: Invalid character in the given encoding. Line 8271, position 163
标签: c# xml encoding