From 4f01f25a724eaf9bbbfd2cc602325049e8dba8a6 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Wed, 12 Feb 2014 23:34:43 +0100 Subject: [PATCH] remove invalid XML characters while building document --- PortablePorts/NReadability/DomExtensions.cs | 25 ++++++++++++++++++++- ReadSharp.Tests/ReadTests.cs | 9 ++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/PortablePorts/NReadability/DomExtensions.cs b/PortablePorts/NReadability/DomExtensions.cs index edf42cd..62f19bb 100644 --- a/PortablePorts/NReadability/DomExtensions.cs +++ b/PortablePorts/NReadability/DomExtensions.cs @@ -22,12 +22,25 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Xml.Linq; namespace ReadSharp.Ports.NReadability { public static class DomExtensions { + // filters control characters but allows only properly-formed surrogate sequences + private static Regex _invalidXMLChars = new Regex(@"(? + /// removes any unusual unicode characters that can't be encoded into XML + /// + public static string RemoveInvalidXMLChars(string text) + { + if (String.IsNullOrEmpty(text)) return ""; + return _invalidXMLChars.Replace(text, ""); + } + #region XDocument extensions public static XElement GetBody(this XDocument document) @@ -229,7 +242,17 @@ namespace ReadSharp.Ports.NReadability foreach (var childNode in container.Nodes()) { - resultSb.Append(childNode.ToString(SaveOptions.DisableFormatting)); + try + { + resultSb.Append(childNode.ToString(SaveOptions.DisableFormatting)); + } + catch (ArgumentException) + { + if (childNode is XElement) + { + resultSb.Append(RemoveInvalidXMLChars((childNode as XElement).Value)); + } + } } return resultSb.ToString(); diff --git a/ReadSharp.Tests/ReadTests.cs b/ReadSharp.Tests/ReadTests.cs index f193484..d75b859 100644 --- a/ReadSharp.Tests/ReadTests.cs +++ b/ReadSharp.Tests/ReadTests.cs @@ -184,5 +184,14 @@ namespace ReadSharp.Tests result = await reader.Read(new Uri("http://arstechnica.com/apple/2014/01/two-steps-forward-a-review-of-the-2013-mac-pro/")); Assert.NotNull(result.NextPage); } + + [Fact] + public async Task DebugArticle() + { + string uri = "http://habrahabr.ru/post/211905/"; + + Article result = await reader.Read(new Uri(uri)); + Assert.NotEmpty(result.Content); + } } } \ No newline at end of file