Decompiled source of STCC ShortTermCompatibilityChecker v1.6.0
App/HtmlAgilityPack.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; using System.Xml.XPath; using System.Xml.Xsl; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CLSCompliant(true)] [assembly: AssemblyTitle("Html Agility Pack - Release")] [assembly: InternalsVisibleTo("HtmlAgilityPack.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010027dc71d8e0b968c7324238e18a4cee4a367f1bf50c9d7a52d91ed46c6a1a584b9142c1d4234c4011d25437c909924079660c434eebe6d2c46412f30520a276e7ca8d8fa7075bb8b9e1c7502ef0e50423b32d469ba750012823fde16989ab42d8428ca5fdd0b06b801788a17239b78e0f75900012a50c5038ab93abbe2ac0d6ee")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("ZZZ Projects Inc.")] [assembly: AssemblyProduct("Html Agility Pack")] [assembly: AssemblyCopyright("Copyright © ZZZ Projects Inc.")] [assembly: AssemblyTrademark("SQL & .NET Tools")] [assembly: ComVisible(true)] [assembly: Guid("643622ea-d2aa-4572-a2b2-6202b7fcd83f")] [assembly: AssemblyFileVersion("1.11.54")] [assembly: AssemblyInformationalVersion("1.11.54")] [assembly: AllowPartiallyTrustedCallers] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyName("")] [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] [assembly: AssemblyVersion("1.11.54.0")] namespace HtmlAgilityPack; [Obsolete("This type should not be used; it is intended for internal use in HTML Agility Pack.")] [CLSCompliant(false)] public class Crc32 { private uint _crc32; private static uint[] crc_32_tab = new uint[256] { 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u }; internal uint CheckSum { get { return _crc32; } set { _crc32 = value; } } public static uint CRC32Bytes(byte[] bytes) { uint num = uint.MaxValue; int num2 = bytes.Length; int num3 = 0; while (num2 > 0) { num2--; num = UPDC32(bytes[num2], num); num3++; } return ~num; } public static uint CRC32String(string text) { uint num = uint.MaxValue; int num2 = text.Length; int num3 = 0; while (num2 > 0) { num2--; char num4 = text[num2]; byte octet = (byte)(num4 & 0xFFu); num = UPDC32((byte)((int)num4 >> 8), num); num = UPDC32(octet, num); num3++; } return ~num; } internal uint AddToCRC32(int c) { return AddToCRC32((ushort)c); } internal uint AddToCRC32(ushort c) { byte octet = (byte)(c & 0xFFu); byte octet2 = (byte)(c >> 8); _crc32 = UPDC32(octet2, _crc32); _crc32 = UPDC32(octet, _crc32); return ~_crc32; } private static uint UPDC32(byte octet, uint crc) { return crc_32_tab[(crc ^ octet) & 0xFF] ^ (crc >> 8); } } internal class EncodingFoundException : Exception { private Encoding _encoding; internal Encoding Encoding => _encoding; internal EncodingFoundException(Encoding encoding) { _encoding = encoding; } } [DebuggerDisplay("Name: {OriginalName}, Value: {Value}")] public class HtmlAttribute : IComparable { private int _line; internal int _lineposition; internal string _name; internal int _namelength; internal int _namestartindex; internal HtmlDocument _ownerdocument; internal HtmlNode _ownernode; private AttributeValueQuote _quoteType = AttributeValueQuote.DoubleQuote; internal int _streamposition; internal string _value; internal int _valuelength; internal int _valuestartindex; internal bool _isFromParse; internal bool _hasEqual; private bool? _localUseOriginalName; public int Line { get { return _line; } internal set { _line = value; } } public int LinePosition => _lineposition; public int ValueStartIndex => _valuestartindex; public int ValueLength => _valuelength; public bool UseOriginalName { get { bool result = false; if (_localUseOriginalName.HasValue) { result = _localUseOriginalName.Value; } else if (OwnerDocument != null) { result = OwnerDocument.OptionDefaultUseOriginalName; } return result; } set { _localUseOriginalName = value; } } public string Name { get { if (_name == null) { _name = _ownerdocument.Text.Substring(_namestartindex, _namelength); } if (!UseOriginalName) { return _name.ToLowerInvariant(); } return _name; } set { if (value == null) { throw new ArgumentNullException("value"); } _name = value; if (_ownernode != null) { _ownernode.SetChanged(); } } } public string OriginalName => _name; public HtmlDocument OwnerDocument => _ownerdocument; public HtmlNode OwnerNode => _ownernode; public AttributeValueQuote QuoteType { get { return _quoteType; } set { _quoteType = value; } } internal AttributeValueQuote InternalQuoteType { get; set; } public int StreamPosition => _streamposition; public string Value { get { if (_value == null && _ownerdocument.Text == null && _valuestartindex == 0 && _valuelength == 0) { return null; } if (_value == null) { _value = _ownerdocument.Text.Substring(_valuestartindex, _valuelength); if (!_ownerdocument.BackwardCompatibility) { _value = HtmlEntity.DeEntitize(_value); } } return _value; } set { _value = value; if (_ownernode != null) { _ownernode.SetChanged(); } } } public string DeEntitizeValue => HtmlEntity.DeEntitize(Value); internal string XmlName => HtmlDocument.GetXmlName(Name, isAttribute: true, OwnerDocument.OptionPreserveXmlNamespaces); internal string XmlValue => Value; public string XPath => ((OwnerNode == null) ? "/" : (OwnerNode.XPath + "/")) + GetRelativeXpath(); internal HtmlAttribute(HtmlDocument ownerdocument) { _ownerdocument = ownerdocument; } public int CompareTo(object obj) { if (!(obj is HtmlAttribute htmlAttribute)) { throw new ArgumentException("obj"); } return Name.CompareTo(htmlAttribute.Name); } public HtmlAttribute Clone() { return new HtmlAttribute(_ownerdocument) { Name = OriginalName, Value = Value, QuoteType = QuoteType, InternalQuoteType = InternalQuoteType, _isFromParse = _isFromParse, _hasEqual = _hasEqual }; } public void Remove() { _ownernode.Attributes.Remove(this); } private string GetRelativeXpath() { if (OwnerNode == null) { return Name; } int num = 1; foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)OwnerNode.Attributes) { if (!(item.Name != Name)) { if (item == this) { break; } num++; } } return "@" + Name + "[" + num + "]"; } } public enum AttributeValueQuote { SingleQuote, DoubleQuote, None, WithoutValue, Initial } public class HtmlAttributeCollection : IList<HtmlAttribute>, ICollection<HtmlAttribute>, IEnumerable<HtmlAttribute>, IEnumerable { internal Dictionary<string, HtmlAttribute> Hashitems = new Dictionary<string, HtmlAttribute>(StringComparer.OrdinalIgnoreCase); private HtmlNode _ownernode; internal List<HtmlAttribute> items = new List<HtmlAttribute>(); public int Count => items.Count; public bool IsReadOnly => false; public HtmlAttribute this[int index] { get { return items[index]; } set { HtmlAttribute htmlAttribute = items[index]; items[index] = value; if (htmlAttribute.Name != value.Name) { Hashitems.Remove(htmlAttribute.Name); } Hashitems[value.Name] = value; value._ownernode = _ownernode; _ownernode.SetChanged(); } } public HtmlAttribute this[string name] { get { if (name == null) { throw new ArgumentNullException("name"); } if (!Hashitems.TryGetValue(name, out var value)) { return null; } return value; } set { if (!Hashitems.TryGetValue(name, out var value2)) { Append(value); } else { this[items.IndexOf(value2)] = value; } } } internal HtmlAttributeCollection(HtmlNode ownernode) { _ownernode = ownernode; } public void Add(string name, string value) { Append(name, value); } public void Add(HtmlAttribute item) { Append(item); } public void AddRange(IEnumerable<HtmlAttribute> items) { foreach (HtmlAttribute item in items) { Append(item); } } public void AddRange(Dictionary<string, string> items) { foreach (KeyValuePair<string, string> item in items) { Add(item.Key, item.Value); } } void ICollection<HtmlAttribute>.Clear() { Clear(); } public bool Contains(HtmlAttribute item) { return items.Contains(item); } public void CopyTo(HtmlAttribute[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); } IEnumerator<HtmlAttribute> IEnumerable<HtmlAttribute>.GetEnumerator() { return items.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return items.GetEnumerator(); } public int IndexOf(HtmlAttribute item) { return items.IndexOf(item); } public void Insert(int index, HtmlAttribute item) { if (item == null) { throw new ArgumentNullException("item"); } Hashitems[item.Name] = item; item._ownernode = _ownernode; items.Insert(index, item); _ownernode.SetChanged(); } bool ICollection<HtmlAttribute>.Remove(HtmlAttribute item) { if (item == null) { return false; } int attributeIndex = GetAttributeIndex(item); if (attributeIndex == -1) { return false; } RemoveAt(attributeIndex); return true; } public void RemoveAt(int index) { HtmlAttribute htmlAttribute = items[index]; Hashitems.Remove(htmlAttribute.Name); items.RemoveAt(index); _ownernode.SetChanged(); } public HtmlAttribute Append(HtmlAttribute newAttribute) { if (_ownernode.NodeType == HtmlNodeType.Text || _ownernode.NodeType == HtmlNodeType.Comment) { throw new Exception("A Text or Comment node cannot have attributes."); } if (newAttribute == null) { throw new ArgumentNullException("newAttribute"); } Hashitems[newAttribute.Name] = newAttribute; newAttribute._ownernode = _ownernode; items.Add(newAttribute); _ownernode.SetChanged(); return newAttribute; } public HtmlAttribute Append(string name) { HtmlAttribute newAttribute = _ownernode._ownerdocument.CreateAttribute(name); return Append(newAttribute); } public HtmlAttribute Append(string name, string value) { HtmlAttribute newAttribute = _ownernode._ownerdocument.CreateAttribute(name, value); return Append(newAttribute); } public bool Contains(string name) { for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, name, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } public HtmlAttribute Prepend(HtmlAttribute newAttribute) { Insert(0, newAttribute); return newAttribute; } public void Remove(HtmlAttribute attribute) { if (attribute == null) { throw new ArgumentNullException("attribute"); } int attributeIndex = GetAttributeIndex(attribute); if (attributeIndex == -1) { throw new IndexOutOfRangeException(); } RemoveAt(attributeIndex); } public void Remove(string name) { if (name == null) { throw new ArgumentNullException("name"); } for (int num = items.Count - 1; num >= 0; num--) { if (string.Equals(items[num].Name, name, StringComparison.OrdinalIgnoreCase)) { RemoveAt(num); } } } public void RemoveAll() { Hashitems.Clear(); items.Clear(); _ownernode.SetChanged(); } public IEnumerable<HtmlAttribute> AttributesWithName(string attributeName) { for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, attributeName, StringComparison.OrdinalIgnoreCase)) { yield return items[i]; } } } public void Remove() { items.Clear(); } internal void Clear() { Hashitems.Clear(); items.Clear(); } internal int GetAttributeIndex(HtmlAttribute attribute) { if (attribute == null) { throw new ArgumentNullException("attribute"); } for (int i = 0; i < items.Count; i++) { if (items[i] == attribute) { return i; } } return -1; } internal int GetAttributeIndex(string name) { if (name == null) { throw new ArgumentNullException("name"); } for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, name, StringComparison.OrdinalIgnoreCase)) { return i; } } return -1; } } internal class HtmlCmdLine { internal static bool Help; static HtmlCmdLine() { Help = false; ParseArgs(); } internal static string GetOption(string name, string def) { string ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetStringArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } internal static string GetOption(int index, string def) { string ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); int num = 0; for (int i = 1; i < commandLineArgs.Length; i++) { if (GetStringArg(commandLineArgs[i], ref ArgValue)) { if (index == num) { return ArgValue; } ArgValue = def; num++; } } return ArgValue; } internal static bool GetOption(string name, bool def) { bool ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetBoolArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } internal static int GetOption(string name, int def) { int ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetIntArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } private static void GetBoolArg(string Arg, string Name, ref bool ArgValue) { if (Arg.Length >= Name.Length + 1 && ('/' == Arg[0] || '-' == Arg[0]) && Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant()) { ArgValue = true; } } private static void GetIntArg(string Arg, string Name, ref int ArgValue) { if (Arg.Length < Name.Length + 3 || ('/' != Arg[0] && '-' != Arg[0]) || !(Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant())) { return; } try { ArgValue = Convert.ToInt32(Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2)); } catch { } } private static bool GetStringArg(string Arg, ref string ArgValue) { if ('/' == Arg[0] || '-' == Arg[0]) { return false; } ArgValue = Arg; return true; } private static void GetStringArg(string Arg, string Name, ref string ArgValue) { if (Arg.Length >= Name.Length + 3 && ('/' == Arg[0] || '-' == Arg[0]) && Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant()) { ArgValue = Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2); } } private static void ParseArgs() { string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetBoolArg(commandLineArgs[i], "?", ref Help); GetBoolArg(commandLineArgs[i], "h", ref Help); GetBoolArg(commandLineArgs[i], "help", ref Help); } } } public class HtmlCommentNode : HtmlNode { private string _comment; public string Comment { get { if (_comment == null) { return base.InnerHtml; } return _comment; } set { _comment = value; } } public override string InnerHtml { get { if (_comment == null) { return base.InnerHtml; } return _comment; } set { _comment = value; } } public override string OuterHtml { get { if (_comment == null) { return base.OuterHtml; } return "<!--" + _comment + "-->"; } } internal HtmlCommentNode(HtmlDocument ownerdocument, int index) : base(HtmlNodeType.Comment, ownerdocument, index) { } } internal class HtmlConsoleListener : TraceListener { public override void Write(string Message) { Write(Message, ""); } public override void Write(string Message, string Category) { Console.Write("T:" + Category + ": " + Message); } public override void WriteLine(string Message) { Write(Message + "\n"); } public override void WriteLine(string Message, string Category) { Write(Message + "\n", Category); } } public class HtmlDocument : IXPathNavigable { private enum ParseState { Text, WhichTag, Tag, BetweenAttributes, EmptyTag, AttributeName, AttributeBeforeEquals, AttributeAfterEquals, AttributeValue, Comment, QuotedAttributeValue, ServerSideCode, PcData } internal static bool _disableBehaviorTagP = true; private static int _maxDepthLevel = int.MaxValue; private int _c; private Crc32 _crc32; private HtmlAttribute _currentattribute; private HtmlNode _currentnode; private Encoding _declaredencoding; private HtmlNode _documentnode; private bool _fullcomment; private int _index; internal Dictionary<string, HtmlNode> Lastnodes = new Dictionary<string, HtmlNode>(); private HtmlNode _lastparentnode; private int _line; private int _lineposition; private int _maxlineposition; internal Dictionary<string, HtmlNode> Nodesid; private ParseState _oldstate; private bool _onlyDetectEncoding; internal Dictionary<int, HtmlNode> Openednodes; private List<HtmlParseError> _parseerrors = new List<HtmlParseError>(); private string _remainder; private int _remainderOffset; private ParseState _state; private Encoding _streamencoding; private bool _useHtmlEncodingForStream; public string Text; public bool BackwardCompatibility = true; public bool OptionAddDebuggingAttributes; public bool OptionAutoCloseOnEnd; public bool OptionCheckSyntax = true; public bool OptionComputeChecksum; public bool OptionEmptyCollection; public bool DisableServerSideCode; public Encoding OptionDefaultStreamEncoding; public bool OptionXmlForceOriginalComment; public bool OptionExtractErrorSourceText; public int OptionExtractErrorSourceTextMaxLength = 100; public bool OptionFixNestedTags; public bool OptionOutputAsXml; public bool OptionPreserveXmlNamespaces; public bool OptionOutputOptimizeAttributeValues; public AttributeValueQuote? GlobalAttributeValueQuote; public bool OptionOutputOriginalCase; public bool OptionOutputUpperCase; public bool OptionReadEncoding = true; public string OptionStopperNodeName; public bool OptionDefaultUseOriginalName; public bool OptionUseIdAttribute = true; public bool OptionWriteEmptyNodes; public int OptionMaxNestedChildNodes; internal static readonly string HtmlExceptionRefNotChild = "Reference node must be a child of this node"; internal static readonly string HtmlExceptionUseIdAttributeFalse = "You need to set UseIdAttribute property to true to enable this feature"; internal static readonly string HtmlExceptionClassDoesNotExist = "Class name doesn't exist"; internal static readonly string HtmlExceptionClassExists = "Class name already exists"; internal static readonly Dictionary<string, string[]> HtmlResetters = new Dictionary<string, string[]> { { "li", new string[2] { "ul", "ol" } }, { "tr", new string[1] { "table" } }, { "th", new string[2] { "tr", "table" } }, { "td", new string[2] { "tr", "table" } } }; private static List<string> BlockAttributes = new List<string> { "\"", "'" }; public static bool DisableBehaviorTagP { get { return _disableBehaviorTagP; } set { if (value) { if (HtmlNode.ElementsFlags.ContainsKey("p")) { HtmlNode.ElementsFlags.Remove("p"); } } else if (!HtmlNode.ElementsFlags.ContainsKey("p")) { HtmlNode.ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed); } _disableBehaviorTagP = value; } } public static Action<HtmlDocument> DefaultBuilder { get; set; } public Action<HtmlDocument> ParseExecuting { get; set; } public string ParsedText => Text; public static int MaxDepthLevel { get { return _maxDepthLevel; } set { _maxDepthLevel = value; } } public int CheckSum { get { if (_crc32 != null) { return (int)_crc32.CheckSum; } return 0; } } public Encoding DeclaredEncoding => _declaredencoding; public HtmlNode DocumentNode => _documentnode; public Encoding Encoding => GetOutEncoding(); public IEnumerable<HtmlParseError> ParseErrors => _parseerrors; public string Remainder => _remainder; public int RemainderOffset => _remainderOffset; public Encoding StreamEncoding => _streamencoding; public HtmlDocument() { if (DefaultBuilder != null) { DefaultBuilder(this); } _documentnode = CreateNode(HtmlNodeType.Document, 0); OptionDefaultStreamEncoding = Encoding.Default; } public static string GetXmlName(string name) { return GetXmlName(name, isAttribute: false, preserveXmlNamespaces: false); } public void UseAttributeOriginalName(string tagName) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)DocumentNode.SelectNodes("//" + tagName)) { foreach (HtmlAttribute item2 in (IEnumerable<HtmlAttribute>)item.Attributes) { item2.UseOriginalName = true; } } } public static string GetXmlName(string name, bool isAttribute, bool preserveXmlNamespaces) { string text = string.Empty; bool flag = true; for (int i = 0; i < name.Length; i++) { if ((name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z') || (name[i] >= '0' && name[i] <= '9') || ((isAttribute || preserveXmlNamespaces) && name[i] == ':') || name[i] == '_' || name[i] == '-' || name[i] == '.') { text += name[i]; continue; } flag = false; byte[] bytes = Encoding.UTF8.GetBytes(new char[1] { name[i] }); for (int j = 0; j < bytes.Length; j++) { text += bytes[j].ToString("x2"); } text += "_"; } if (flag) { return text; } return "_" + text; } public static string HtmlEncode(string html) { return HtmlEncodeWithCompatibility(html); } internal static string HtmlEncodeWithCompatibility(string html, bool backwardCompatibility = true) { if (html == null) { throw new ArgumentNullException("html"); } return (backwardCompatibility ? new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;))", RegexOptions.IgnoreCase) : new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;)|(nbsp;)|(reg;))", RegexOptions.IgnoreCase)).Replace(html, "&").Replace("<", "<").Replace(">", ">") .Replace("\"", """); } public static bool IsWhiteSpace(int c) { if (c == 10 || c == 13 || c == 32 || c == 9) { return true; } return false; } public HtmlAttribute CreateAttribute(string name) { if (name == null) { throw new ArgumentNullException("name"); } HtmlAttribute htmlAttribute = CreateAttribute(); htmlAttribute.Name = name; return htmlAttribute; } public HtmlAttribute CreateAttribute(string name, string value) { if (name == null) { throw new ArgumentNullException("name"); } HtmlAttribute htmlAttribute = CreateAttribute(name); htmlAttribute.Value = value; return htmlAttribute; } public HtmlCommentNode CreateComment() { return (HtmlCommentNode)CreateNode(HtmlNodeType.Comment); } public HtmlCommentNode CreateComment(string comment) { if (comment == null) { throw new ArgumentNullException("comment"); } HtmlCommentNode htmlCommentNode = CreateComment(); htmlCommentNode.Comment = comment; return htmlCommentNode; } public HtmlNode CreateElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } HtmlNode htmlNode = CreateNode(HtmlNodeType.Element); htmlNode.SetName(name); return htmlNode; } public HtmlTextNode CreateTextNode() { return (HtmlTextNode)CreateNode(HtmlNodeType.Text); } public HtmlTextNode CreateTextNode(string text) { if (text == null) { throw new ArgumentNullException("text"); } HtmlTextNode htmlTextNode = CreateTextNode(); htmlTextNode.Text = text; return htmlTextNode; } public Encoding DetectEncoding(Stream stream) { return DetectEncoding(stream, checkHtml: false); } public Encoding DetectEncoding(Stream stream, bool checkHtml) { _useHtmlEncodingForStream = checkHtml; if (stream == null) { throw new ArgumentNullException("stream"); } return DetectEncoding(new StreamReader(stream)); } public Encoding DetectEncoding(TextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } _onlyDetectEncoding = true; if (OptionCheckSyntax) { Openednodes = new Dictionary<int, HtmlNode>(); } else { Openednodes = null; } if (OptionUseIdAttribute) { Nodesid = new Dictionary<string, HtmlNode>(StringComparer.OrdinalIgnoreCase); } else { Nodesid = null; } if (reader is StreamReader streamReader && !_useHtmlEncodingForStream) { Text = streamReader.ReadToEnd(); _streamencoding = streamReader.CurrentEncoding; return _streamencoding; } _streamencoding = null; _declaredencoding = null; Text = reader.ReadToEnd(); _documentnode = CreateNode(HtmlNodeType.Document, 0); try { Parse(); } catch (EncodingFoundException ex) { return ex.Encoding; } return _streamencoding; } public Encoding DetectEncodingHtml(string html) { if (html == null) { throw new ArgumentNullException("html"); } using StringReader reader = new StringReader(html); return DetectEncoding(reader); } public HtmlNode GetElementbyId(string id) { if (id == null) { throw new ArgumentNullException("id"); } if (Nodesid == null) { throw new Exception(HtmlExceptionUseIdAttributeFalse); } if (!Nodesid.ContainsKey(id)) { return null; } return Nodesid[id]; } public void Load(Stream stream) { Load(new StreamReader(stream, OptionDefaultStreamEncoding)); } public void Load(Stream stream, bool detectEncodingFromByteOrderMarks) { Load(new StreamReader(stream, detectEncodingFromByteOrderMarks)); } public void Load(Stream stream, Encoding encoding) { Load(new StreamReader(stream, encoding)); } public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks) { Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks)); } public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize) { Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize)); } public void Load(TextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } _onlyDetectEncoding = false; if (OptionCheckSyntax) { Openednodes = new Dictionary<int, HtmlNode>(); } else { Openednodes = null; } if (OptionUseIdAttribute) { Nodesid = new Dictionary<string, HtmlNode>(StringComparer.OrdinalIgnoreCase); } else { Nodesid = null; } if (reader is StreamReader streamReader) { try { streamReader.Peek(); } catch (Exception) { } _streamencoding = streamReader.CurrentEncoding; } else { _streamencoding = null; } _declaredencoding = null; Text = reader.ReadToEnd(); _documentnode = CreateNode(HtmlNodeType.Document, 0); Parse(); if (!OptionCheckSyntax || Openednodes == null) { return; } foreach (HtmlNode value in Openednodes.Values) { if (!value._starttag) { continue; } string text; if (OptionExtractErrorSourceText) { text = value.OuterHtml; if (text.Length > OptionExtractErrorSourceTextMaxLength) { text = text.Substring(0, OptionExtractErrorSourceTextMaxLength); } } else { text = string.Empty; } AddError(HtmlParseErrorCode.TagNotClosed, value._line, value._lineposition, value._streamposition, text, "End tag </" + value.Name + "> was not found"); } Openednodes.Clear(); } public void LoadHtml(string html) { if (html == null) { throw new ArgumentNullException("html"); } using StringReader reader = new StringReader(html); Load(reader); } public void Save(Stream outStream) { StreamWriter writer = new StreamWriter(outStream, GetOutEncoding()); Save(writer); } public void Save(Stream outStream, Encoding encoding) { if (outStream == null) { throw new ArgumentNullException("outStream"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } StreamWriter writer = new StreamWriter(outStream, encoding); Save(writer); } public void Save(StreamWriter writer) { Save((TextWriter)writer); } public void Save(TextWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } DocumentNode.WriteTo(writer); writer.Flush(); } public void Save(XmlWriter writer) { DocumentNode.WriteTo(writer); writer.Flush(); } internal HtmlAttribute CreateAttribute() { return new HtmlAttribute(this); } internal HtmlNode CreateNode(HtmlNodeType type) { return CreateNode(type, -1); } internal HtmlNode CreateNode(HtmlNodeType type, int index) { return type switch { HtmlNodeType.Comment => new HtmlCommentNode(this, index), HtmlNodeType.Text => new HtmlTextNode(this, index), _ => new HtmlNode(type, this, index), }; } internal Encoding GetOutEncoding() { return _declaredencoding ?? _streamencoding ?? OptionDefaultStreamEncoding; } internal HtmlNode GetXmlDeclaration() { if (!_documentnode.HasChildNodes) { return null; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)_documentnode._childnodes) { if (item.Name == "?xml") { return item; } } return null; } internal void SetIdForNode(HtmlNode node, string id) { if (OptionUseIdAttribute && Nodesid != null && id != null) { if (node == null) { Nodesid.Remove(id); } else { Nodesid[id] = node; } } } internal void UpdateLastParentNode() { do { if (_lastparentnode.Closed) { _lastparentnode = _lastparentnode.ParentNode; } } while (_lastparentnode != null && _lastparentnode.Closed); if (_lastparentnode == null) { _lastparentnode = _documentnode; } } private void AddError(HtmlParseErrorCode code, int line, int linePosition, int streamPosition, string sourceText, string reason) { HtmlParseError item = new HtmlParseError(code, line, linePosition, streamPosition, sourceText, reason); _parseerrors.Add(item); } private void CloseCurrentNode() { if (_currentnode.Closed) { return; } bool flag = false; HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); if (dictionaryValueOrDefault == null) { if (HtmlNode.IsClosedElement(_currentnode.Name)) { _currentnode.CloseNode(_currentnode); if (_lastparentnode != null) { HtmlNode htmlNode = null; Stack<HtmlNode> stack = new Stack<HtmlNode>(); if (!_currentnode.Name.Equals("br")) { for (HtmlNode htmlNode2 = _lastparentnode.LastChild; htmlNode2 != null; htmlNode2 = htmlNode2.PreviousSibling) { if (htmlNode2.Name == _currentnode.Name && !htmlNode2.HasChildNodes) { htmlNode = htmlNode2; break; } stack.Push(htmlNode2); } } if (htmlNode != null) { while (stack.Count != 0) { HtmlNode htmlNode3 = stack.Pop(); _lastparentnode.RemoveChild(htmlNode3); htmlNode.AppendChild(htmlNode3); } } else { _lastparentnode.AppendChild(_currentnode); } } } else if (HtmlNode.CanOverlapElement(_currentnode.Name)) { HtmlNode htmlNode4 = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex); htmlNode4._outerlength = _currentnode._outerlength; ((HtmlTextNode)htmlNode4).Text = ((HtmlTextNode)htmlNode4).Text.ToLowerInvariant(); if (_lastparentnode != null) { _lastparentnode.AppendChild(htmlNode4); } } else if (HtmlNode.IsEmptyElement(_currentnode.Name)) { AddError(HtmlParseErrorCode.EndTagNotRequired, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "End tag </" + _currentnode.Name + "> is not required"); } else { AddError(HtmlParseErrorCode.TagNotOpened, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "Start tag <" + _currentnode.Name + "> was not found"); flag = true; } } else { if (OptionFixNestedTags && FindResetterNodes(dictionaryValueOrDefault, GetResetters(_currentnode.Name))) { AddError(HtmlParseErrorCode.EndTagInvalidHere, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "End tag </" + _currentnode.Name + "> invalid here"); flag = true; } if (!flag) { Lastnodes[_currentnode.Name] = dictionaryValueOrDefault._prevwithsamename; dictionaryValueOrDefault.CloseNode(_currentnode); } } if (!flag && _lastparentnode != null && (!HtmlNode.IsClosedElement(_currentnode.Name) || _currentnode._starttag)) { UpdateLastParentNode(); } } private string CurrentNodeName() { return Text.Substring(_currentnode._namestartindex, _currentnode._namelength); } private void DecrementPosition() { _index--; if (_lineposition == 0) { _lineposition = _maxlineposition; _line--; } else { _lineposition--; } } private HtmlNode FindResetterNode(HtmlNode node, string name) { HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, name); if (dictionaryValueOrDefault == null) { return null; } if (dictionaryValueOrDefault.Closed) { return null; } if (dictionaryValueOrDefault._streamposition < node._streamposition) { return null; } return dictionaryValueOrDefault; } private bool FindResetterNodes(HtmlNode node, string[] names) { if (names == null) { return false; } for (int i = 0; i < names.Length; i++) { if (FindResetterNode(node, names[i]) != null) { return true; } } return false; } private void FixNestedTag(string name, string[] resetters) { if (resetters != null) { HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); if (dictionaryValueOrDefault != null && !Lastnodes[name].Closed && !FindResetterNodes(dictionaryValueOrDefault, resetters)) { HtmlNode htmlNode = new HtmlNode(dictionaryValueOrDefault.NodeType, this, -1); htmlNode._endnode = htmlNode; dictionaryValueOrDefault.CloseNode(htmlNode); } } } private void FixNestedTags() { if (_currentnode._starttag) { string name = CurrentNodeName(); FixNestedTag(name, GetResetters(name)); } } private string[] GetResetters(string name) { if (!HtmlResetters.TryGetValue(name, out var value)) { return null; } return value; } private void IncrementPosition() { if (_crc32 != null) { _crc32.AddToCRC32(_c); } _index++; _maxlineposition = _lineposition; if (_c == 10) { _lineposition = 0; _line++; } else { _lineposition++; } } private bool IsValidTag() { if (_c == 60 && _index < Text.Length) { if (!char.IsLetter(Text[_index]) && Text[_index] != '/' && Text[_index] != '?' && Text[_index] != '!') { return Text[_index] == '%'; } return true; } return false; } private bool NewCheck() { if (_c != 60 || !IsValidTag()) { return false; } if (_index < Text.Length && Text[_index] == '%') { if (DisableServerSideCode) { return false; } switch (_state) { case ParseState.AttributeAfterEquals: PushAttributeValueStart(_index - 1); break; case ParseState.BetweenAttributes: PushAttributeNameStart(_index - 1, _lineposition - 1); break; case ParseState.WhichTag: PushNodeNameStart(starttag: true, _index - 1); _state = ParseState.Tag; break; } _oldstate = _state; _state = ParseState.ServerSideCode; return true; } if (!PushNodeEnd(_index - 1, close: true)) { _index = Text.Length; return true; } _state = ParseState.WhichTag; if (_index - 1 <= Text.Length - 2 && (Text[_index] == '!' || Text[_index] == '?')) { PushNodeStart(HtmlNodeType.Comment, _index - 1, _lineposition - 1); PushNodeNameStart(starttag: true, _index); PushNodeNameEnd(_index + 1); _state = ParseState.Comment; if (_index < Text.Length - 2) { if (Text[_index + 1] == '-' && Text[_index + 2] == '-') { _fullcomment = true; } else { _fullcomment = false; } } return true; } PushNodeStart(HtmlNodeType.Element, _index - 1, _lineposition - 1); return true; } private void Parse() { if (ParseExecuting != null) { ParseExecuting(this); } int num = 0; if (OptionComputeChecksum) { _crc32 = new Crc32(); } Lastnodes = new Dictionary<string, HtmlNode>(); _c = 0; _fullcomment = false; _parseerrors = new List<HtmlParseError>(); _line = 1; _lineposition = 0; _maxlineposition = 0; _state = ParseState.Text; _oldstate = _state; _documentnode._innerlength = Text.Length; _documentnode._outerlength = Text.Length; _remainderOffset = Text.Length; _lastparentnode = _documentnode; _currentnode = CreateNode(HtmlNodeType.Text, 0); _currentattribute = null; _index = 0; PushNodeStart(HtmlNodeType.Text, 0, _lineposition); while (_index < Text.Length) { _c = Text[_index]; IncrementPosition(); switch (_state) { case ParseState.Text: if (!NewCheck()) { } break; case ParseState.WhichTag: if (!NewCheck()) { if (_c == 47) { PushNodeNameStart(starttag: false, _index); } else { PushNodeNameStart(starttag: true, _index - 1); DecrementPosition(); } _state = ParseState.Tag; } break; case ParseState.Tag: if (NewCheck()) { break; } if (IsWhiteSpace(_c)) { CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { _state = ParseState.BetweenAttributes; } } else if (_c == 47) { CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { _state = ParseState.EmptyTag; } } else { if (_c != 62) { break; } CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.Tag) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } } break; case ParseState.BetweenAttributes: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 47 || _c == 63) { _state = ParseState.EmptyTag; } else if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.BetweenAttributes) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else { PushAttributeNameStart(_index - 1, _lineposition - 1); _state = ParseState.AttributeName; } break; case ParseState.EmptyTag: if (NewCheck()) { break; } if (_c == 62) { if (!PushNodeEnd(_index, close: true)) { _index = Text.Length; } else if (_state == ParseState.EmptyTag) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else if (!IsWhiteSpace(_c)) { DecrementPosition(); _state = ParseState.BetweenAttributes; } else { _state = ParseState.BetweenAttributes; } break; case ParseState.AttributeName: if (NewCheck()) { break; } _currentattribute._isFromParse = true; if (_c == 47) { PushAttributeNameEnd(_index - 1); _state = ParseState.AttributeBeforeEquals; } else if (IsWhiteSpace(_c)) { PushAttributeNameEnd(_index - 1); _state = ParseState.AttributeBeforeEquals; } else if (_c == 61) { PushAttributeNameEnd(_index - 1); _currentattribute._hasEqual = true; _state = ParseState.AttributeAfterEquals; } else if (_c == 62) { PushAttributeNameEnd(_index - 1); if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeName) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } break; case ParseState.AttributeBeforeEquals: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeBeforeEquals) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else if (_c == 61) { _currentattribute._hasEqual = true; _state = ParseState.AttributeAfterEquals; } else { _state = ParseState.BetweenAttributes; DecrementPosition(); } break; case ParseState.AttributeAfterEquals: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 39 || _c == 34) { _state = ParseState.QuotedAttributeValue; PushAttributeValueStart(_index, _c); num = _c; } else if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeAfterEquals) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else { PushAttributeValueStart(_index - 1); _state = ParseState.AttributeValue; } break; case ParseState.AttributeValue: if (NewCheck()) { break; } if (IsWhiteSpace(_c)) { PushAttributeValueEnd(_index - 1); _state = ParseState.BetweenAttributes; } else if (_c == 62) { PushAttributeValueEnd(_index - 1); if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeValue) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } break; case ParseState.QuotedAttributeValue: if (_c == num) { PushAttributeValueEnd(_index - 1); _state = ParseState.BetweenAttributes; } else if (_c == 60 && _index < Text.Length && Text[_index] == '%') { _oldstate = _state; _state = ParseState.ServerSideCode; } break; case ParseState.Comment: if (_c == 62 && (!_fullcomment || (Text[_index - 2] == '-' && Text[_index - 3] == '-') || (Text[_index - 2] == '!' && Text[_index - 3] == '-' && Text[_index - 4] == '-'))) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; break; } _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } break; case ParseState.ServerSideCode: if (_c == 37) { if (_index < Text.Length && Text[_index] == '>') { switch (_oldstate) { case ParseState.AttributeAfterEquals: _state = ParseState.AttributeValue; break; case ParseState.BetweenAttributes: PushAttributeNameEnd(_index + 1); _state = ParseState.BetweenAttributes; break; default: _state = _oldstate; break; } IncrementPosition(); } } else if (_oldstate == ParseState.QuotedAttributeValue && _c == num) { _state = _oldstate; DecrementPosition(); } break; case ParseState.PcData: { if (_currentnode._namelength + 3 > Text.Length - (_index - 1) || string.Compare(Text.Substring(_index - 1, _currentnode._namelength + 2), "</" + _currentnode.Name, StringComparison.OrdinalIgnoreCase) != 0) { break; } int num2 = Text[_index - 1 + 2 + _currentnode.Name.Length]; if (num2 == 62 || IsWhiteSpace(num2)) { HtmlNode htmlNode = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex + _currentnode._outerlength); htmlNode._outerlength = _index - 1 - htmlNode._outerstartindex; htmlNode._streamposition = htmlNode._outerstartindex; htmlNode._line = _currentnode.Line; htmlNode._lineposition = _currentnode.LinePosition + _currentnode._namelength + 2; _currentnode.AppendChild(htmlNode); if (_currentnode.Name.ToLowerInvariant().Equals("script") || _currentnode.Name.ToLowerInvariant().Equals("style")) { _currentnode._isHideInnerText = true; } PushNodeStart(HtmlNodeType.Element, _index - 1, _lineposition - 1); PushNodeNameStart(starttag: false, _index - 1 + 2); _state = ParseState.Tag; IncrementPosition(); } break; } } } if (_currentnode._namestartindex > 0) { PushNodeNameEnd(_index); } PushNodeEnd(_index, close: false); Lastnodes.Clear(); } private void PushAttributeNameEnd(int index) { _currentattribute._namelength = index - _currentattribute._namestartindex; if (_currentattribute.Name != null && !BlockAttributes.Contains(_currentattribute.Name)) { _currentnode.Attributes.Append(_currentattribute); } } private void PushAttributeNameStart(int index, int lineposition) { _currentattribute = CreateAttribute(); _currentattribute._namestartindex = index; _currentattribute.Line = _line; _currentattribute._lineposition = lineposition; _currentattribute._streamposition = index; } private void PushAttributeValueEnd(int index) { _currentattribute._valuelength = index - _currentattribute._valuestartindex; } private void PushAttributeValueStart(int index) { PushAttributeValueStart(index, 0); } private void CloseParentImplicitExplicitNode() { bool flag = true; while (flag && !_lastparentnode.Closed) { flag = false; bool flag2 = false; if (IsParentImplicitEnd()) { if (OptionOutputAsXml) { flag2 = true; } else { CloseParentImplicitEnd(); flag = true; } } if (flag2 || IsParentExplicitEnd()) { CloseParentExplicitEnd(); flag = true; } } } private bool IsParentImplicitEnd() { if (!_currentnode._starttag) { return false; } bool result = false; string name = _lastparentnode.Name; string text = Text.Substring(_currentnode._namestartindex, _index - _currentnode._namestartindex - 1).ToLowerInvariant(); switch (name) { case "a": result = text == "a"; break; case "dd": result = text == "dt" || text == "dd"; break; case "dt": result = text == "dt" || text == "dd"; break; case "li": result = text == "li"; break; case "p": if (DisableBehaviorTagP) { int num; switch (text) { default: num = ((text == "ul") ? 1 : 0); break; case "address": case "article": case "aside": case "blockquote": case "dir": case "div": case "dl": case "fieldset": case "footer": case "form": case "h1": case "h2": case "h3": case "h4": case "h5": case "h6": case "header": case "hr": case "li": case "menu": case "nav": case "ol": case "p": case "pre": case "section": case "table": num = 1; break; } result = (byte)num != 0; } else { result = text == "p"; } break; case "option": result = text == "option"; break; } return result; } private bool IsParentExplicitEnd() { if (!_currentnode._starttag) { return false; } bool result = false; string name = _lastparentnode.Name; string text = Text.Substring(_currentnode._namestartindex, _index - _currentnode._namestartindex - 1).ToLowerInvariant(); switch (name) { case "title": result = text == "title"; break; case "p": result = text == "div"; break; case "table": result = text == "table"; break; case "tr": result = text == "tr"; break; case "td": result = text == "td" || text == "th" || text == "tr"; break; case "th": result = text == "td" || text == "th" || text == "tr"; break; case "h1": { int num5; switch (text) { default: num5 = ((text == "h5") ? 1 : 0); break; case "h2": case "h3": case "h4": num5 = 1; break; } result = (byte)num5 != 0; break; } case "h2": { int num4; switch (text) { default: num4 = ((text == "h5") ? 1 : 0); break; case "h1": case "h3": case "h4": num4 = 1; break; } result = (byte)num4 != 0; break; } case "h3": { int num3; switch (text) { default: num3 = ((text == "h5") ? 1 : 0); break; case "h1": case "h2": case "h4": num3 = 1; break; } result = (byte)num3 != 0; break; } case "h4": { int num2; switch (text) { default: num2 = ((text == "h5") ? 1 : 0); break; case "h1": case "h2": case "h3": num2 = 1; break; } result = (byte)num2 != 0; break; } case "h5": { int num; switch (text) { default: num = ((text == "h4") ? 1 : 0); break; case "h1": case "h2": case "h3": num = 1; break; } result = (byte)num != 0; break; } } return result; } private void CloseParentImplicitEnd() { HtmlNode htmlNode = new HtmlNode(_lastparentnode.NodeType, this, -1); htmlNode._endnode = htmlNode; htmlNode._isImplicitEnd = true; _lastparentnode._isImplicitEnd = true; _lastparentnode.CloseNode(htmlNode); } private void CloseParentExplicitEnd() { HtmlNode htmlNode = new HtmlNode(_lastparentnode.NodeType, this, -1); htmlNode._endnode = htmlNode; _lastparentnode.CloseNode(htmlNode); } private void PushAttributeValueStart(int index, int quote) { _currentattribute._valuestartindex = index; if (quote == 39) { _currentattribute.QuoteType = AttributeValueQuote.SingleQuote; } _currentattribute.InternalQuoteType = _currentattribute.QuoteType; if (quote == 0) { _currentattribute.InternalQuoteType = AttributeValueQuote.None; } } private bool PushNodeEnd(int index, bool close) { _currentnode._outerlength = index - _currentnode._outerstartindex; if (_currentnode._nodetype == HtmlNodeType.Text || _currentnode._nodetype == HtmlNodeType.Comment) { if (_currentnode._outerlength > 0) { _currentnode._innerlength = _currentnode._outerlength; _currentnode._innerstartindex = _currentnode._outerstartindex; if (_lastparentnode != null) { _lastparentnode.AppendChild(_currentnode); } } } else if (_currentnode._starttag && _lastparentnode != _currentnode) { if (_lastparentnode != null) { _lastparentnode.AppendChild(_currentnode); } ReadDocumentEncoding(_currentnode); HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); _currentnode._prevwithsamename = dictionaryValueOrDefault; Lastnodes[_currentnode.Name] = _currentnode; if (_currentnode.NodeType == HtmlNodeType.Document || _currentnode.NodeType == HtmlNodeType.Element) { _lastparentnode = _currentnode; } if (HtmlNode.IsCDataElement(CurrentNodeName())) { _state = ParseState.PcData; return true; } if (HtmlNode.IsClosedElement(_currentnode.Name) || HtmlNode.IsEmptyElement(_currentnode.Name)) { close = true; } } if (close || !_currentnode._starttag) { if (OptionStopperNodeName != null && _remainder == null && string.Compare(_currentnode.Name, OptionStopperNodeName, StringComparison.OrdinalIgnoreCase) == 0) { _remainderOffset = index; _remainder = Text.Substring(_remainderOffset); CloseCurrentNode(); return false; } CloseCurrentNode(); } return true; } private void PushNodeNameEnd(int index) { _currentnode._namelength = index - _currentnode._namestartindex; if (OptionFixNestedTags) { FixNestedTags(); } } private void PushNodeNameStart(bool starttag, int index) { _currentnode._starttag = starttag; _currentnode._namestartindex = index; } private void PushNodeStart(HtmlNodeType type, int index, int lineposition) { _currentnode = CreateNode(type, index); _currentnode._line = _line; _currentnode._lineposition = lineposition; _currentnode._streamposition = index; } private void ReadDocumentEncoding(HtmlNode node) { if (!OptionReadEncoding || node._namelength != 4 || node.Name != "meta") { return; } string text = null; HtmlAttribute htmlAttribute = node.Attributes["http-equiv"]; if (htmlAttribute != null) { if (string.Compare(htmlAttribute.Value, "content-type", StringComparison.OrdinalIgnoreCase) != 0) { return; } HtmlAttribute htmlAttribute2 = node.Attributes["content"]; if (htmlAttribute2 != null) { text = NameValuePairList.GetNameValuePairsValue(htmlAttribute2.Value, "charset"); } } else { htmlAttribute = node.Attributes["charset"]; if (htmlAttribute != null) { text = htmlAttribute.Value; } } if (!string.IsNullOrEmpty(text)) { if (string.Equals(text, "utf8", StringComparison.OrdinalIgnoreCase)) { text = "utf-8"; } try { _declaredencoding = Encoding.GetEncoding(text); } catch (ArgumentException) { _declaredencoding = null; } if (_onlyDetectEncoding) { throw new EncodingFoundException(_declaredencoding); } if (_streamencoding != null && _declaredencoding != null && _declaredencoding.CodePage != _streamencoding.CodePage) { AddError(HtmlParseErrorCode.CharsetMismatch, _line, _lineposition, _index, node.OuterHtml, "Encoding mismatch between StreamEncoding: " + _streamencoding.WebName + " and DeclaredEncoding: " + _declaredencoding.WebName); } } } public void DetectEncodingAndLoad(string path) { DetectEncodingAndLoad(path, detectEncoding: true); } public void DetectEncodingAndLoad(string path, bool detectEncoding) { if (path == null) { throw new ArgumentNullException("path"); } Encoding encoding = ((!detectEncoding) ? null : DetectEncoding(path)); if (encoding == null) { Load(path); } else { Load(path, encoding); } } public Encoding DetectEncoding(string path) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, OptionDefaultStreamEncoding); return DetectEncoding(reader); } public void Load(string path) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, OptionDefaultStreamEncoding); Load(reader); } public void Load(string path, bool detectEncodingFromByteOrderMarks) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, detectEncodingFromByteOrderMarks); Load(reader); } public void Load(string path, Encoding encoding) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding); Load(reader); } public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks); Load(reader); } public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize); Load(reader); } public void Save(string filename) { using StreamWriter writer = new StreamWriter(filename, append: false, GetOutEncoding()); Save(writer); } public void Save(string filename, Encoding encoding) { if (filename == null) { throw new ArgumentNullException("filename"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamWriter writer = new StreamWriter(filename, append: false, encoding); Save(writer); } public XPathNavigator CreateNavigator() { return new HtmlNodeNavigator(this, _documentnode); } } [Flags] public enum HtmlElementFlag { CData = 1, Empty = 2, Closed = 4, CanOverlap = 8 } public class HtmlEntity { private enum ParseState { Text, EntityStart } private static readonly int _maxEntitySize; private static Dictionary<int, string> _entityName; private static Dictionary<string, int> _entityValue; public static bool UseWebUtility { get; set; } public static Dictionary<int, string> EntityName => _entityName; public static Dictionary<string, int> EntityValue => _entityValue; static HtmlEntity() { _entityName = new Dictionary<int, string>(); _entityValue = new Dictionary<string, int>(); _entityValue.Add("quot", 34); _entityName.Add(34, "quot"); _entityValue.Add("amp", 38); _entityName.Add(38, "amp"); _entityValue.Add("apos", 39); _entityName.Add(39, "apos"); _entityValue.Add("lt", 60); _entityName.Add(60, "lt"); _entityValue.Add("gt", 62); _entityName.Add(62, "gt"); _entityValue.Add("nbsp", 160); _entityName.Add(160, "nbsp"); _entityValue.Add("iexcl", 161); _entityName.Add(161, "iexcl"); _entityValue.Add("cent", 162); _entityName.Add(162, "cent"); _entityValue.Add("pound", 163); _entityName.Add(163, "pound"); _entityValue.Add("curren", 164); _entityName.Add(164, "curren"); _entityValue.Add("yen", 165); _entityName.Add(165, "yen"); _entityValue.Add("brvbar", 166); _entityName.Add(166, "brvbar"); _entityValue.Add("sect", 167); _entityName.Add(167, "sect"); _entityValue.Add("uml", 168); _entityName.Add(168, "uml"); _entityValue.Add("copy", 169); _entityName.Add(169, "copy"); _entityValue.Add("ordf", 170); _entityName.Add(170, "ordf"); _entityValue.Add("laquo", 171); _entityName.Add(171, "laquo"); _entityValue.Add("not", 172); _entityName.Add(172, "not"); _entityValue.Add("shy", 173); _entityName.Add(173, "shy"); _entityValue.Add("reg", 174); _entityName.Add(174, "reg"); _entityValue.Add("macr", 175); _entityName.Add(175, "macr"); _entityValue.Add("deg", 176); _entityName.Add(176, "deg"); _entityValue.Add("plusmn", 177); _entityName.Add(177, "plusmn"); _entityValue.Add("sup2", 178); _entityName.Add(178, "sup2"); _entityValue.Add("sup3", 179); _entityName.Add(179, "sup3"); _entityValue.Add("acute", 180); _entityName.Add(180, "acute"); _entityValue.Add("micro", 181); _entityName.Add(181, "micro"); _entityValue.Add("para", 182); _entityName.Add(182, "para"); _entityValue.Add("middot", 183); _entityName.Add(183, "middot"); _entityValue.Add("cedil", 184); _entityName.Add(184, "cedil"); _entityValue.Add("sup1", 185); _entityName.Add(185, "sup1"); _entityValue.Add("ordm", 186); _entityName.Add(186, "ordm"); _entityValue.Add("raquo", 187); _entityName.Add(187, "raquo"); _entityValue.Add("frac14", 188); _entityName.Add(188, "frac14"); _entityValue.Add("frac12", 189); _entityName.Add(189, "frac12"); _entityValue.Add("frac34", 190); _entityName.Add(190, "frac34"); _entityValue.Add("iquest", 191); _entityName.Add(191, "iquest"); _entityValue.Add("Agrave", 192); _entityName.Add(192, "Agrave"); _entityValue.Add("Aacute", 193); _entityName.Add(193, "Aacute"); _entityValue.Add("Acirc", 194); _entityName.Add(194, "Acirc"); _entityValue.Add("Atilde", 195); _entityName.Add(195, "Atilde"); _entityValue.Add("Auml", 196); _entityName.Add(196, "Auml"); _entityValue.Add("Aring", 197); _entityName.Add(197, "Aring"); _entityValue.Add("AElig", 198); _entityName.Add(198, "AElig"); _entityValue.Add("Ccedil", 199); _entityName.Add(199, "Ccedil"); _entityValue.Add("Egrave", 200); _entityName.Add(200, "Egrave"); _entityValue.Add("Eacute", 201); _entityName.Add(201, "Eacute"); _entityValue.Add("Ecirc", 202); _entityName.Add(202, "Ecirc"); _entityValue.Add("Euml", 203); _entityName.Add(203, "Euml"); _entityValue.Add("Igrave", 204); _entityName.Add(204, "Igrave"); _entityValue.Add("Iacute", 205); _entityName.Add(205, "Iacute"); _entityValue.Add("Icirc", 206); _entityName.Add(206, "Icirc"); _entityValue.Add("Iuml", 207); _entityName.Add(207, "Iuml"); _entityValue.Add("ETH", 208); _entityName.Add(208, "ETH"); _entityValue.Add("Ntilde", 209); _entityName.Add(209, "Ntilde"); _entityValue.Add("Ograve", 210); _entityName.Add(210, "Ograve"); _entityValue.Add("Oacute", 211); _entityName.Add(211, "Oacute"); _entityValue.Add("Ocirc", 212); _entityName.Add(212, "Ocirc"); _entityValue.Add("Otilde", 213); _entityName.Add(213, "Otilde"); _entityValue.Add("Ouml", 214); _entityName.Add(214, "Ouml"); _entityValue.Add("times", 215); _entityName.Add(215, "times"); _entityValue.Add("Oslash", 216); _entityName.Add(216, "Oslash"); _entityValue.Add("Ugrave", 217); _entityName.Add(217, "Ugrave"); _entityValue.Add("Uacute", 218); _entityName.Add(218, "Uacute"); _entityValue.Add("Ucirc", 219); _entityName.Add(219, "Ucirc"); _entityValue.Add("Uuml", 220); _entityName.Add(220, "Uuml"); _entityValue.Add("Yacute", 221); _entityName.Add(221, "Yacute"); _entityValue.Add("THORN", 222); _entityName.Add(222, "THORN"); _entityValue.Add("szlig", 223); _entityName.Add(223, "szlig"); _entityValue.Add("agrave", 224); _entityName.Add(224, "agrave"); _entityValue.Add("aacute", 225); _entityName.Add(225, "aacute"); _entityValue.Add("acirc", 226); _entityName.Add(226, "acirc"); _entityValue.Add("atilde", 227); _entityName.Add(227, "atilde"); _entityValue.Add("auml", 228); _entityName.Add(228, "auml"); _entityValue.Add("aring", 229); _entityName.Add(229, "aring"); _entityValue.Add("aelig", 230); _entityName.Add(230, "aelig"); _entityValue.Add("ccedil", 231); _entityName.Add(231, "ccedil"); _entityValue.Add("egrave", 232); _entityName.Add(232, "egrave"); _entityValue.Add("eacute", 233); _entityName.Add(233, "eacute"); _entityValue.Add("ecirc", 234); _entityName.Add(234, "ecirc"); _entityValue.Add("euml", 235); _entityName.Add(235, "euml"); _entityValue.Add("igrave", 236); _entityName.Add(236, "igrave"); _entityValue.Add("iacute", 237); _entityName.Add(237, "iacute"); _entityValue.Add("icirc", 238); _entityName.Add(238, "icirc"); _entityValue.Add("iuml", 239); _entityName.Add(239, "iuml"); _entityValue.Add("eth", 240); _entityName.Add(240, "eth"); _entityValue.Add("ntilde", 241); _entityName.Add(241, "ntilde"); _entityValue.Add("ograve", 242); _entityName.Add(242, "ograve"); _entityValue.Add("oacute", 243); _entityName.Add(243, "oacute"); _entityValue.Add("ocirc", 244); _entityName.Add(244, "ocirc"); _entityValue.Add("otilde", 245); _entityName.Add(245, "otilde"); _entityValue.Add("ouml", 246); _entityName.Add(246, "ouml"); _entityValue.Add("divide", 247); _entityName.Add(247, "divide"); _entityValue.Add("oslash", 248); _entityName.Add(248, "oslash"); _entityValue.Add("ugrave", 249); _entityName.Add(249, "ugrave"); _entityValue.Add("uacute", 250); _entityName.Add(250, "uacute"); _entityValue.Add("ucirc", 251); _entityName.Add(251, "ucirc"); _entityValue.Add("uuml", 252); _entityName.Add(252, "uuml"); _entityValue.Add("yacute", 253); _entityName.Add(253, "yacute"); _entityValue.Add("thorn", 254); _entityName.Add(254, "thorn"); _entityValue.Add("yuml", 255); _entityName.Add(255, "yuml"); _entityValue.Add("fnof", 402); _entityName.Add(402, "fnof"); _entityValue.Add("Alpha", 913); _entityName.Add(913, "Alpha"); _entityValue.Add("Beta", 914); _entityName.Add(914, "Beta"); _entityValue.Add("Gamma", 915); _entityName.Add(915, "Gamma"); _entityValue.Add("Delta", 916); _entityName.Add(916, "Delta"); _entityValue.Add("Epsilon", 917); _entityName.Add(917, "Epsilon"); _entityValue.Add("Zeta", 918); _entityName.Add(918, "Zeta"); _entityValue.Add("Eta", 919); _entityName.Add(919, "Eta"); _entityValue.Add("Theta", 920); _entityName.Add(920, "Theta"); _entityValue.Add("Iota", 921); _entityName.Add(921, "Iota"); _entityValue.Add("Kappa", 922); _entityName.Add(922, "Kappa"); _entityValue.Add("Lambda", 923); _entityName.Add(923, "Lambda"); _entityValue.Add("Mu", 924); _entityName.Add(924, "Mu"); _entityValue.Add("Nu", 925); _entityName.Add(925, "Nu"); _entityValue.Add("Xi", 926); _entityName.Add(926, "Xi"); _entityValue.Add("Omicron", 927); _entityName.Add(927, "Omicron"); _entityValue.Add("Pi", 928); _entityName.Add(928, "Pi"); _entityValue.Add("Rho", 929); _entityName.Add(929, "Rho"); _entityValue.Add("Sigma", 931); _entityName.Add(931, "Sigma"); _entityValue.Add("Tau", 932); _entityName.Add(932, "Tau"); _entityValue.Add("Upsilon", 933); _entityName.Add(933, "Upsilon"); _entityValue.Add("Phi", 934); _entityName.Add(934, "Phi"); _entityValue.Add("Chi", 935); _entityName.Add(935, "Chi"); _entityValue.Add("Psi", 936); _entityName.Add(936, "Psi"); _entityValue.Add("Omega", 937); _entityName.Add(937, "Omega"); _entityValue.Add("alpha", 945); _entityName.Add(945, "alpha"); _entityValue.Add("beta", 946); _entityName.Add(946, "beta"); _entityValue.Add("gamma", 947); _entityName.Add(947, "gamma"); _entityValue.Add("delta", 948); _entityName.Add(948, "delta"); _entityValue.Add("epsilon", 949); _entityName.Add(949, "epsilon"); _entityValue.Add("zeta", 950); _entityName.Add(950, "zeta"); _entityValue.Add("eta", 951); _entityName.Add(951, "eta"); _entityValue.Add("theta", 952); _entityName.Add(952, "theta"); _entityValue.Add("iota", 953); _entityName.Add(953, "iota"); _entityValue.Add("kappa", 954); _entityName.Add(954, "kappa"); _entityValue.Add("lambda", 955); _entityName.Add(955, "lambda"); _entityValue.Add("mu", 956); _entityName.Add(956, "mu"); _entityValue.Add("nu", 957); _entityName.Add(957, "nu"); _entityValue.Add("xi", 958); _entityName.Add(958, "xi"); _entityValue.Add("omicron", 959); _entityName.Add(959, "omicron"); _entityValue.Add("pi", 960); _entityName.Add(960, "pi"); _entityValue.Add("rho", 961); _entityName.Add(961, "rho"); _entityValue.Add("sigmaf", 962); _entityName.Add(962, "sigmaf"); _entityValue.Add("sigma", 963); _entityName.Add(963, "sigma"); _entityValue.Add("tau", 964); _entityName.Add(964, "tau"); _entityValue.Add("upsilon", 965); _entityName.Add(965, "upsilon"); _entityValue.Add("phi", 966); _entityName.Add(966, "phi"); _entityValue.Add("chi", 967); _entityName.Add(967, "chi"); _entityValue.Add("psi", 968); _entityName.Add(968, "psi"); _entityValue.Add("omega", 969); _entityName.Add(969, "omega"); _entityValue.Add("thetasym", 977); _entityName.Add(977, "thetasym"); _entityValue.Add("upsih", 978); _entityName.Add(978, "upsih"); _entityValue.Add("piv", 982); _entityName.Add(982, "piv"); _entityValue.Add("bull", 8226); _entityName.Add(8226, "bull"); _entityValue.Add("hellip", 8230); _entityName.Add(8230, "hellip"); _entityValue.Add("prime", 8242); _entityName.Add(8242, "prime"); _entityValue.Add("Prime", 8243); _entityName.Add(8243, "Prime"); _entityValue.Add("oline", 8254); _entityName.Add(8254, "oline"); _entityValue.Add("frasl", 8260); _entityName.Add(8260, "frasl"); _entityValue.Add("weierp", 8472); _entityName.Add(8472, "weierp"); _entityValue.Add("image", 8465); _entityName.Add(8465, "image"); _entityValue.Add("real", 8476); _entityName.Add(8476, "real"); _entityValue.Add("trade", 8482); _entityName.Add(8482, "trade"); _entityValue.Add("alefsym", 8501); _entityName.Add(8501, "alefsym"); _entityValue.Add("larr", 8592); _entityName.Add(8592, "larr"); _entityValue.Add("uarr", 8593); _entityName.Add(8593, "uarr"); _entityValue.Add("rarr", 8594); _entityName.Add(8594, "rarr"); _entityValue.Add("darr", 8595); _entityName.Add(8595, "darr"); _entityValue.Add("harr", 8596); _entityName.Add(8596, "harr"); _entityValue.Add("crarr", 8629); _entityName.Add(8629, "crarr"); _entityValue.Add("lArr", 8656); _entityName.Add(8656, "lArr"); _entityValue.Add("uArr", 8657); _entityName.Add(8657, "uArr"); _entityValue.Add("rArr", 8658); _entityName.Add(8658, "rArr"); _entityValue.Add("dArr", 8659); _entityName.Add(8659, "dArr"); _entityValue.Add("hArr", 8660); _entityName.Add(8660, "hArr"); _entityValue.Add("forall", 8704); _entityName.Add(8704, "forall"); _entityValue.Add("part", 8706); _entityName.Add(8706, "part"); _entityValue.Add("exist", 8707); _entityName.Add(8707, "exist"); _entityValue.Add("empty", 8709); _entityName.Add(8709, "empty"); _entityValue.Add("nabla", 8711); _entityName.Add(8711, "nabla"); _entityValue.Add("isin", 8712); _entityName.Add(8712, "isin"); _entityValue.Add("notin", 8713); _entityName.Add(8713, "notin"); _entityValue.Add("ni", 8715); _entityName.Add(8715, "ni"); _entityValue.Add("prod", 8719); _entityName.Add(8719, "prod"); _entityValue.Add("sum", 8721); _entityName.Add(8721, "sum"); _entityValue.Add("minus", 8722); _entityName.Add(8722, "minus"); _entityValue.Add("lowast", 8727); _entityName.Add(8727, "lowast"); _entityValue.Add("radic", 8730); _entityName.Add(8730, "radic"); _entityValue.Add("prop", 8733); _entityName.Add(8733, "prop"); _entityValue.Add("infin", 8734); _entityName.Add(8734, "infin"); _entityValue.Add("ang", 8736); _entityName.Add(8736, "ang"); _entityValue.Add("and", 8743); _entityName.Add(8743, "and"); _entityValue.Add("or", 8744); _entityName.Add(8744, "or"); _entityValue.Add("cap", 8745); _entityName.Add(8745, "cap"); _entityValue.Add("cup", 8746); _entityName.Add(8746, "cup"); _entityValue.Add("int", 8747); _entityName.Add(8747, "int"); _entityValue.Add("there4", 8756); _entityName.Add(8756, "there4"); _entityValue.Add("sim", 8764); _entityName.Add(8764, "sim"); _entityValue.Add("cong", 8773); _entityName.Add(8773, "cong"); _entityValue.Add("asymp", 8776); _entityName.Add(8776, "asymp"); _entityValue.Add("ne", 8800); _entityName.Add(8800, "ne"); _entityValue.Add("equiv", 8801); _entityName.Add(8801, "equiv"); _entityValue.Add("le", 8804); _entityName.Add(8804, "le"); _entityValue.Add("ge", 8805); _entityName.Add(8805, "ge"); _entityValue.Add("sub", 8834); _entityName.Add(8834, "sub"); _entityValue.Add("sup", 8835); _entityName.Add(8835, "sup"); _entityValue.Add("nsub", 8836); _entityName.Add(8836, "nsub"); _entityValue.Add("sube", 8838); _entityName.Add(8838, "sube"); _entityValue.Add("supe", 8839); _entityName.Add(8839, "supe"); _entityValue.Add("oplus", 8853); _entityName.Add(8853, "oplus"); _entityValue.Add("otimes", 8855); _entityName.Add(8855, "otimes"); _entityValue.Add("perp", 8869); _entityName.Add(8869, "perp"); _entityValue.Add("sdot", 8901); _entityName.Add(8901, "sdot"); _entityValue.Add("lceil", 8968); _entityName.Add(8968, "lceil"); _entityValue.Add("rceil", 8969); _entityName.Add(8969, "rceil"); _entityValue.Add("lfloor", 8970); _entityName.Add(8970, "lfloor"); _entityValue.Add("rfloor", 8971); _entityName.Add(8971, "rfloor"); _entityValue.Add("lang", 9001); _entityName.Add(9001, "lang"); _entityValue.Add("rang", 9002); _entityName.Add(9002, "rang"); _entityValue.Add("loz", 9674); _entityName.Add(9674, "loz"); _entityValue.Add("spades", 9824); _entityName.Add(9824, "spades"); _entityValue.Add("clubs", 9827); _entityName.Add(9827, "clubs"); _entityValue.Add("hearts", 9829); _entityName.Add(9829, "hearts"); _entityValue.Add("diams", 9830); _entityName.Add(9830, "diams"); _entityValue.Add("OElig", 338); _entityName.Add(338, "OElig"); _entityValue.Add("oelig", 339); _entityName.Add(339, "oelig"); _entityValue.Add("Scaron", 352); _entityName.Add(352, "Scaron"); _entityValue.Add("scaron", 353); _entityName.Add(353, "scaron"); _entityValue.Add("Yuml", 376); _entityName.Add(376, "Yuml"); _entityValue.Add("circ", 710); _entityName.Add(710, "circ"); _entityValue.Add("tilde", 732); _entityName.Add(732, "tilde"); _entityValue.Add("ensp", 8194); _entityName.Add(8194, "ensp"); _entityValue.Add("emsp", 8195); _entityName.Add(8195, "emsp"); _entityValue.Add("thinsp", 8201); _entityName.Add(8201, "thinsp"); _entityValue.Add("zwnj", 8204); _entityName.Add(8204, "zwnj"); _entityValue.Add("zwj", 8205); _entityName.Add(8205, "zwj"); _entityValue.Add("lrm", 8206); _entityName.Add(8206, "lrm"); _entityValue.Add("rlm", 8207); _entityName.Add(8207, "rlm"); _entityValue.Add("ndash", 8211); _entityName.Add(8211, "ndash"); _entityValue.Add("mdash", 8212); _entityName.Add(8212, "mdash"); _entityValue.Add("lsquo", 8216); _entityName.Add(8216, "lsquo"); _entityValue.Add("rsquo", 8217); _entityName.Add(8217, "rsquo"); _entityValue.Add("sbquo", 8218); _entityName.Add(8218, "sbquo"); _entityValue.Add("ldquo", 8220); _entityName.Add(8220, "ldquo"); _entityValue.Add("rdquo", 8221); _entityName.Add(8221, "rdquo"); _entityValue.Add("bdquo", 8222); _entityName.Add(8222, "bdquo"); _entityValue.Add("dagger", 8224); _entityName.Add(8224, "dagger"); _entityValue.Add("Dagger", 8225); _entityName.Add(8225, "Dagger"); _entityValue.Add("permil", 8240); _entityName.Add(8240, "permil"); _entityValue.Add("lsaquo", 8249); _entityName.Add(8249, "lsaquo"); _entityValue.Add("rsaquo", 8250); _entityName.Add(8250, "rsaquo"); _entityValue.Add("euro", 8364); _entityName.Add(8364, "euro"); _maxEntitySize = 9; } private HtmlEntity() { } public static string DeEntitize(string text) { if (text == null) { return null; } if (text.Length == 0) { return text; } StringBuilder stringBuilder = new StringBuilder(text.Length); ParseState parseState = ParseState.Text; StringBuilder stringBuilder2 = new StringBuilder(10); for (int i = 0; i < text.Length; i++) { switch (parseState) { case ParseState.Text: if (text[i] == '&') { parseState = ParseState.EntityStart; } else { stringBuilder.Append(text[i]); } break; case ParseState.EntityStart: switch (text[i]) { case ';': if (stringBuilder2.Length == 0) { stringBuilder.Append("&;"); } else { int value2; if (stringBuilder2[0] == '#') { string text2 = stringBuilder2.ToString(); try { string text3 = text2.Substring(1).Trim(); int fromBase; if (text3.StartsWith("x", StringComparison.OrdinalIgnoreCase)) { fromBase = 16; text3 = text3.Substring(1); } else { fromBase = 10; } int value = Convert.ToInt32(text3, fromBase); stringBuilder.Append(Convert.ToChar(value)); } catch { stringBuilder.Append("&#" + text2 + ";"); } } else if (!_entityValue.TryGetValue(stringBuilder2.ToString(), out value2)) { stringBuilder.Append("&" + stringBuilder2?.ToString() + ";"); } else { stringBuilder.Append(Convert.ToChar(value2)); } stringBuilder2.Remove(0, stringBuilder2.Length); } parseState = ParseState.Text; break; case '&': stringBuilder.Append("&" + stringBuilder2); stringBuilder2.Remove(0, stringBuilder2.Length); break; default: stringBuilder2.Append(text[i]); if (stringBuilder2.Length > _maxEntitySize) { parseState = ParseState.Text; stringBuilder.Append("&" + stringBuilder2); stringBuilder2.Remove(0, stringBuilder2.Length); } break; } break; } } if (parseState == ParseState.EntityStart) { stringBuilder.Append("&" + stringBuilder2); } return stringBuilder.ToString(); } public static HtmlNode Entitize(HtmlNode node) { if (node == null) { throw new ArgumentNullException("node"); } HtmlNode htmlNode = node.CloneNode(deep: true); if (htmlNode.HasAttributes) { Entitize(htmlNode.Attributes); } if (htmlNode.HasChildNodes) { Entitize(htmlNode.ChildNodes); } else if (htmlNode.NodeType == HtmlNodeType.Text) { ((HtmlTextNode)htmlNode).Text = Entitize(((HtmlTextNode)htmlNode).Text, useNames: true, entitizeQuotAmpAndLtGt: true); } return htmlNode; } public static string Entitize(string text) { return Entitize(text, useNames: true); } public static string Entitize(string text, bool useNames) { return Entitize(text, useNames, entitizeQuotAmpAndLtGt: false); } public static string Entitize(string text, bool useNames, bool entitizeQuotAmpAndLtGt) { if (text == null) { return null; } if (text.Length == 0) { return text; } StringBuilder stringBuilder = new StringBuilder(text.Length); if (UseWebUtility) { TextElementEnumerator textElementEnumerator = StringInfo.GetTextElementEnumerator(text); while (textElementEnumerator.MoveNext()) { stringBuilder.Append(WebUtility.HtmlEncode(textElementEnumerator.GetTextElement())); } } else { for (int i = 0; i < text.Length; i++) { int num = text[i]; if (num > 127 || (entitizeQuotAmpAndLtGt && (num == 34 || num == 38 || num == 60 || num == 62))) { string value = null; if (useNames) { EntityName.TryGetValue(num, out value); } if (value == null) { stringBuilder.Append("&#" + num + ";"); } else { stringBuilder.Append("&" + value + ";"); } } else { stringBuilder.Append(text[i]); } } } return stringBuilder.ToString(); } private static void Entitize(HtmlAttributeCollection collection) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)collection) { if (item.Value != null) { item.Value = Entitize(item.Value); } } } private static void Entitize(HtmlNodeCollection collection) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)collection) { if (item.HasAttributes) { Entitize(item.Attributes); } if (item.HasChildNodes) { Entitize(item.ChildNodes); } else if (item.NodeType == HtmlNodeType.Text) { ((HtmlTextNode)item).Text = Entitize(((HtmlTextNode)item).Text, useNames: true, entitizeQuotAmpAndLtGt: true); } } } } internal class HtmlNameTable : XmlNameTable { private NameTable _nametable = new NameTable(); public override string Add(string array) { return _nametable.Add(array); } public override string Add(char[] array, int offset, int length) { return _nametable.Add(array, offset, length); } public override string Get(string array) { return _nametable.Get(array); } public override string Get(char[] array, int offset, int length) { return _nametable.Get(array, offset, length); } internal string GetOrAdd(string array) { string text = Get(array); if (text == null) { return Add(array); } return text; } } [DebuggerDisplay("Name: {OriginalName}")] public class HtmlNode : IXPathNavigable { internal const string DepthLevelExceptionMessage = "The document is too complex to parse"; internal HtmlAttributeCollection _attributes; internal HtmlNodeCollection _childnodes; internal HtmlNode _endnode; private bool _changed; internal string _innerhtml; internal int _innerlength; internal int _innerstartindex; internal int _line; internal int _lineposition; private string _name; internal int _namelength; internal int _namestartindex; internal HtmlNode _nextnode; internal HtmlNodeType _nodetype; internal string _outerhtml; internal int _outerlength; internal int _outerstartindex; private string _optimizedName; internal HtmlDocument _ownerdocument; internal HtmlNode _parentnode; internal HtmlNode _prevnode; internal HtmlNode _prevwithsamename; internal bool _starttag; internal int _streamposition; internal bool _isImplicitEnd; internal bool _isHideInnerText; public static readonly string HtmlNodeTypeNameComment; public static readonly string HtmlNodeTypeNameDocument; public static readonly string HtmlNodeTypeNameText; public static Dictionary<string, HtmlElementFlag> ElementsFlags; public HtmlAttributeCollection Attributes { get { if (!HasAttributes) { _attributes = new HtmlAttributeCollection(this); } return _attributes; } internal set { _attributes = value; } } public HtmlNodeCollection ChildNodes { get { return _childnodes ?? (_childnodes = new HtmlNodeCollection(this)); } internal set { _childnodes = value; } } public bool Closed => _endnode != null; public HtmlAttributeCollection ClosingAttributes { get { if (HasClosingAttributes) { return _endnode.Attributes; } return new HtmlAttributeCollection(this); } } public HtmlNode EndNode => _endnode; public HtmlNode FirstChild { get { if (HasChildNodes) { return _childnodes[0]; } return null; } } public bool HasAttributes { get { if (_attributes == null) { return false; } if (_attributes.Count <= 0) { return false; } return true; } } public bool HasChildNodes { get { if (_childnodes == null) { return false; } if (_childnodes.Count <= 0) { return false; } return true; } } public bool HasClosingAttributes { get { if (_endnode == null || _endnode == this) { return false; } if (_endnode._attributes == null) { return false; } if (_endnode._attributes.Count <= 0) { return false; } return true; } } public string Id { get { if (_ownerdocument.Nodesid == null) { throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse); } return GetId(); } set { if (_ownerdocument.Nodesid == null) { throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse); } if (value == null) { throw new ArgumentNullException("value"); } SetId(value); } } public virtual string InnerHtml { get { if (_changed) { UpdateHtml(); return _innerhtml; } if (_innerhtml != null) { return _innerhtml; } if (_innerstartindex < 0 || _innerlength < 0) { return string.Empty; } return _ownerdocument.Text.Substring(_innerstartindex, _innerlength); } set { HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(value); RemoveAllChildren(); AppendChildren(htmlDocument.DocumentNode.ChildNodes); } } public virtual string InnerText { get { StringBuilder stringBuilder = new StringBuilder(); int depthLevel = 0; string name = Name; if (name != null) { name = name.ToLowerInvariant(); bool isDisplayScriptingText = name == "head" || name == "script" || name == "style"; InternalInnerText(stringBuilder, isDisplayScriptingText, depthLevel); } else { InternalInnerText(stringBuilder, isDisplayScriptingText: false, depthLevel); } return stringBuilder.ToString(); } } public HtmlNode LastChild { get { if (HasChildNodes) { return _childnodes[_childnodes.Count - 1]; } return null; } } public int Line { get { return _line; } internal set { _line = value; } } public int LinePosition { get { return _lineposition; } internal set { _lineposition = value; } } public int InnerStartIndex => _innerstartindex; public int OuterStartIndex => _outerstartindex; public int InnerLength => InnerHtml.Length; public int OuterLength => OuterHtml.Length; public string Name { get { if (_optimizedName == null) { if (_name == null) { SetName(_ownerdocument.Text.Substring(_namestartindex, _namelength)); } if (_name == null) { _optimizedName = string.Empty; } else if (OwnerDocument != null) { _optimizedName = (OwnerDocument.OptionDefaultUseOriginalName ? _name : _name.ToLowerInvariant()); } else { _optimizedName = _name.ToLowerInvariant(); } } return _optimizedName; } set { SetName(value); SetChanged(); } } public HtmlNode NextSibling { get { return _nextnode; } internal set { _nextnode = value; } } public HtmlNodeType NodeType { get { return _nodetype; } internal set { _nodetype = value; } } public string OriginalName => _name; public virtual string OuterHtml { get { if (_changed) { UpdateHtml(); return _outerhtml; } if (_outerhtml != null) { return _outerhtml; } if (_outerstartindex < 0 || _outerlength < 0) { return string.Empty; } return _ownerdocument.Text.Substring(_outerstartindex, _outerlength); } } public HtmlDocument OwnerDocument { get { return _ownerdocument; } internal set { _ownerdocument = value; } } public HtmlNode ParentNode { get { return _parentnode; } internal set { _parentnode = value; } } public HtmlNode PreviousSibling { get { return _prevnode; } internal set { _prevnode = value; } } public int StreamPosition => _streamposition; public string XPath => ((ParentNode == null || ParentNode.NodeType == HtmlNodeType.Document) ? "/" : (ParentNode.XPath + "/")) + GetRelativeXpath(); public int Depth { get; set; } static HtmlNode() { HtmlNodeTypeNameComment = "#comment"; HtmlNodeTypeNameDocument = "#document"; HtmlNodeTypeNameText = "#text"; ElementsFlags = new Dictionary<string, HtmlElementFlag>(StringComparer.OrdinalIgnoreCase); ElementsFlags.Add("script", HtmlElementFlag.CData); ElementsFlags.Add("style", HtmlElementFlag.CData); ElementsFlags.Add("noxhtml", HtmlElementFlag.CData); ElementsFlags.Add("textarea", HtmlElementFlag.CData); ElementsFlags.Add("title", HtmlElementFlag.CData); ElementsFlags.Add("base", HtmlElementFlag.Empty); ElementsFlags.Add("link", HtmlElementFlag.Empty); ElementsFlags.Add("meta", HtmlElementFlag.Empty); ElementsFlags.Add("isindex", HtmlElementFlag.Empty); ElementsFlags.Add("hr", HtmlElementFlag.Empty); ElementsFlags.Add("col", HtmlElementFlag.Empty); ElementsFlags.Add("img", HtmlElementFlag.Empty); ElementsFlags.Add("param", HtmlElementFlag.Empty); ElementsFlags.Add("embed", HtmlElementFlag.Empty); ElementsFlags.Add("frame", HtmlElementFlag.Empty); ElementsFlags.Add("wbr", HtmlElementFlag.Empty); ElementsFlags.Add("bgsound", HtmlElementFlag.Empty); ElementsFlags.Add("spacer", HtmlElementFlag.Empty); ElementsFlags.Add("keygen", HtmlElementFlag.Empty); ElementsFlags.Add("area", HtmlElementFlag.Empty); ElementsFlags.Add("input", HtmlElementFlag.Empty); ElementsFlags.Add("basefont", HtmlElementFlag.Empty); ElementsFlags.Add("source", HtmlElementFlag.Empty); ElementsFlags.Add("form", HtmlElementFlag.CanOverlap); ElementsFlags.Add("br", HtmlElementFlag.Empty | HtmlElementFlag.Closed); if (!HtmlDocument.DisableBehaviorTagP) { ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed); } } public HtmlNode(HtmlNodeType type, HtmlDocument ownerdocument, int index) { _nodetype = type; _ownerdocument = ownerdocument; _outerstartindex = index; switch (type) { case HtmlNodeType.Comment: SetName(HtmlNodeTypeNameComment); _endnode = this; break; case HtmlNodeType.Document: SetName(HtmlNodeTypeNameDocument); _endnode = this; break; case HtmlNodeType.Text: SetName(HtmlNodeTypeNameText); _endnode = this; break; } if (_ownerdocument.Openednodes != null && !Closed && -1 != index) { _ownerdocument.Openednodes.Add(index, this); } if (-1 == index && type != HtmlNodeType.Comment && type != HtmlNodeType.Text) { SetChanged(); } } internal virtual void InternalInnerText(StringBuilder sb, bool isDisplayScriptingText, int depthLevel) { depthLevel++; if (depthLevel > HtmlDocument.MaxDepthLevel) { throw new Exception($"Maximum deep level reached: {HtmlDocument.MaxDepthLevel}"); } if (!_ownerdocument.BackwardCompatibility) { if (HasChildNodes) { AppendInnerText(sb, isDisplayScriptingText); } else { sb.Append(GetCurrentNodeText()); } } else if (_nodetype == HtmlNodeType.Text) { sb.Append(((HtmlTextNode)this).Text); } else { if (_nodetype == HtmlNodeType.Comment || !HasChildNodes || (_isHideInnerText && !isDisplayScriptingText)) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { item.InternalInnerText(sb, isDisplayScriptingText, depthLevel); } } } public virtual string GetDirectInnerText() { if (!_ownerdocument.BackwardCompatibility) { if (HasChildNodes) { StringBuilder stringBuilder = new StringBuilder(); AppendDirectInnerText(stringBuilder); return stringBuilder.ToString(); } return GetCurrentNodeText(); } if (_nodetype == HtmlNodeType.Text) { return ((HtmlTextNode)this).Text; } if (_nodetype == HtmlNodeType.Comment) { return ""; } if (!HasChildNodes) { return string.Empty; } StringBuilder stringBuilder2 = new StringBuilder(); foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { if (item._nodetype == HtmlNodeType.Text) { stringBuilder2.Append(((HtmlTextNode)item).Text); } } return stringBuilder2.ToString(); } internal string GetCurrentNodeText() { if (_nodetype == HtmlNodeType.Text) { string text = ((HtmlTextNode)this).Text; if (ParentNode.Name != "pre") { text = text.Replace("\n", "").Replace("\r", "").Replace("\t", ""); } return text; } return ""; } internal void AppendDirectInnerText(StringBuilder sb) { if (_nodetype == HtmlNodeType.Text) { sb.Append(GetCurrentNodeText()); } if (!HasChildNodes) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { sb.Append(item.GetCurrentNodeText()); } } internal void AppendInnerText(StringBuilder sb, bool isShowHideInnerText) { if (_nodetype == HtmlNodeType.Text) { sb.Append(GetCurrentNodeText()); } if (!HasChildNodes || (_isHideInnerText && !isShowHideInnerText)) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { item.AppendInnerText(sb, isShowHideInnerText); } } internal void SetName(string value) { _name = value; _optimizedName = null; } public static bool CanOverlapElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.CanOverlap) != 0; } public static HtmlNode CreateNode(string html) { return CreateNode(html, null); } public static HtmlNode CreateNode(string html, Action<HtmlDocument> htmlDocumentBuilder) { HtmlDocument htmlDocument = new HtmlDocument(); htmlDocumentBuilder?.Invoke(htmlDocument); htmlDocument.LoadHtml(html); if (!htmlDocument.DocumentNode.IsSingleElementNode()) { throw new Exception("Multiple node elements can't be created."); } for (HtmlNode htmlNode = htmlDocument.DocumentNode.FirstChild; htmlNode != null; htmlNode = htmlNode.NextSibling) { if (htmlNode.NodeType == HtmlNodeType.Element && htmlNode.OuterHtml != "\r\n") { return htmlNode; } } return htmlDocument.DocumentNode.FirstChild; } public static bool IsCDataElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.CData) != 0; } public static bool IsClosedElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.Closed) != 0; } public static bool IsEmptyElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (name.Length == 0) { return true; } if ('!' == name[0]) { return true; } if ('?' == name[0]) { return true; } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.Empty) != 0; } public static bool IsOverlappedClosingElement(string text) { if (text == null) { throw new ArgumentNullException("text"); } if (text.Length <= 4) { return false; } if (text[0] != '<' || text[text.Length - 1] != '>' || text[1] != '/') { return false; } return CanOverlapElement(text.Substring(2, text.Length - 3)); } public IEnumerable<HtmlNode> Ancestors() { HtmlNode node = ParentNode; if (node != null) { yield return node; while (node.ParentNode != null) { yield return node.ParentNode; node = node.ParentNode; } } } public IEnumerable<HtmlNode> Ancestors(string name) { for (HtmlNode i = ParentNode; i != null; i = i.ParentNode) { if (i.Name == name) { yield return i; } } } public IEnumerable<HtmlNode> AncestorsAndSelf() { for (HtmlNode i = this; i != null; i = i.ParentNode) { yield return i; } } public IEnumerable<HtmlNode> AncestorsAndSelf(string name) { for (HtmlNode i = this; i != null; i = i.ParentNode) { if (i.Name == name) { yield return i; } } } public HtmlNode AppendChild(HtmlNode newChild) { if (newChild == null) { throw new ArgumentNullException("newChild"); } ChildNodes.Append(newChild); _ownerdocument.SetIdForNode(newChild, newChild.GetId()); SetChildNodesId(newChild); HtmlNode parentnode = _parentnode; HtmlDocument htmlDocument = null; while (parentnode != null) { if (parentnode.OwnerDocument != htmlDocument) { parentnode.OwnerDocument.SetIdForNode(newChild, newChild.GetId()); parentnode.SetChildNodesId(newChild); htmlDocument = parentnode.OwnerDocument; } parentnode = parentnode._parentnode; } SetChanged(); return newChild; } public void SetChildNodesId(HtmlNode chilNode) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)chilNode.ChildNodes) { _ownerdocument.SetIdForNode(item, item.GetId()); if (item.ChildNodes == chilNode.ChildNodes) { throw new Exception("Oops! a scenario that will cause a Stack Overflow has been found. See the following issue for an example: https://github.com/zzzprojects/html-agility-pack/issues/513"); } SetChildNodesId(item); } } public void AppendChildren(HtmlNodeCollection newChildren) { if (newChildren == null) { throw new ArgumentNullException("newChildren"); } foreach (HtmlNode item in (IEnumerable<HtmlNode>)newChildren) { AppendChild(item); } } public IEnumerable<HtmlAttribute> ChildAttributes(string name) { return Attributes.AttributesWithName(name); } public HtmlNode Clone() { return CloneNode(deep: true); } public HtmlNode CloneNode(string newName) { return CloneNode(newName, deep: true); } public HtmlNode CloneNode(string newName, bool deep) { if (newName == null) { throw new ArgumentNullException("newName"); } HtmlNode htmlNode = CloneNode(deep); htmlNode.SetName(newName); return htmlNode; } public HtmlNode CloneNode(bool deep) { HtmlNode htmlNode = _ownerdocument.CreateNode(_nodetype); htmlNode.SetName(OriginalName); switch (_nodetype) { case HtmlNodeType.Comment: ((HtmlCommentNode)htmlNode).Comment = ((HtmlCommentNode)this).Comment; return htmlNode; case HtmlNodeType.Text: ((HtmlTextNode)htmlNode).Text = ((HtmlTextNode)this).Text; return htmlNode; default: if (HasAttributes) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)_attributes) { HtmlAttribute newAttribute = item.Clone(); htmlNode.Attributes.Append(newAttribute); } } if (HasClosingAttributes) { htmlNode._endnode = _endnode.CloneNode(deep: false); foreach (HtmlAttribute item2 in (IEnumerable<HtmlAttribute>)_endnode._attributes) { HtmlAttribute newAttribute2 = item2.Clone(); htmlNode._endnode._attributes.Append(newAttribute2); } } if (!deep) { return htmlNode; } if (!HasChildNodes) { return htmlNode; } { foreach (HtmlNode item3 in (IEnumerable<HtmlNode>)_childnodes) { HtmlNode newChild = item3.CloneNode(deep); htmlNode.AppendChild(newChild); } return htmlNode; } } } public void CopyFrom(HtmlNode node) { CopyFrom(node, deep: true); } public void CopyFrom(HtmlNode node, bool deep) { if (node == null) { throw new ArgumentNullException("node"); } Attributes.RemoveAll(); if (node.HasAttributes) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)node.Attributes) { HtmlAttribute newAttribute = item.Clone(); Attributes.Append(newAttribute); } } if (!deep) { return; } RemoveAllChildren(); if (!node.HasChildNodes) { return; } foreach (HtmlNode item2 in (IEnumerable<HtmlNode>)node.ChildNodes) { AppendChild(item2.CloneNode(deep: true)); } } [Obsolete("Use Descendants() instead, the results of this function will change in a future version")] public IEnumerable<HtmlNode> DescendantNodes(int level = 0) { if (level > HtmlDocument.MaxDepthLevel) { throw new ArgumentException("The document is too complex to parse"); } foreach (HtmlNode node in (IEnumerable<HtmlNode>)ChildNodes) { yield return node; foreach (HtmlNode item in node.DescendantNode
App/Newtonsoft.Json.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("13.0.3.27908")] [assembly: AssemblyInformationalVersion("13.0.3+0a2e291c0d9c0c7675d445703e51750363a549ef")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET 4.5")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/JamesNK/Newtonsoft.Json")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyVersion("13.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } } namespace Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime, DateTimeOffset } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string? Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = Volatile.Read(ref _mask); int num4 = num & num3; for (Entry entry = _entries[num4]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; Volatile.Write(ref _mask, num); } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[]? array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type? _namingStrategyType; private object[]? _namingStrategyParameters; public string? Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[]? NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy? NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Func<JsonSerializerSettings>? DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } public static string ToString(DateTimeOffset value, DateFormatHandling format) { using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } private static string ToStringInternal(BigInteger value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (StringUtils.IndexOf(text, '.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri? value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string? value) { return ToString(value, '"'); } public static string ToString(string? value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object? value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] public static string SerializeObject(object? value) { return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, JsonSerializerSettings? settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] public static object? DeserializeObject(string value) { return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static object? DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } public static void PopulateObject(string value, object target, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } public static string SerializeXmlNode(XmlNode? node) { return SerializeXmlNode(node, Formatting.None); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XmlDocument? DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } public static string SerializeXNode(XObject? node) { return SerializeXNode(node, Formatting.None); } public static string SerializeXNode(XObject? node, Formatting formatting) { return SerializeXNode(node, formatting, omitRootObject: false); } public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XDocument? DeserializeXNode(string value) { return DeserializeXNode(value, null); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer); public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer); public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[]? ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception? innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string? Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal MissingMemberHandling? _missingMemberHandling; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling.GetValueOrDefault(); } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired.GetValueOrDefault(); } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string? PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!StringUtils.EndsWith(message, '.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get; set; } public object[]? NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public int Order { get { return _order.GetValueOrDefault(); } set { _order = value; } } public Required Required { get { return _required.GetValueOrDefault(); } set { _required = value; } } public string? PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object? _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo? _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string? _dateFormatString; private List<JsonPosition>? _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string? DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object? Value => _value; public virtual Type? ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync(); } public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (TokenType == JsonToken.PropertyName) { await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth) { } } } internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken) { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { throw CreateUnexpectedEndException(); } } public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean()); } public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes()); } internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken) { List<byte> buffer = new List<byte>(); do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(buffer)); byte[] array = buffer.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime()); } public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset()); } public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal()); } public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(ReadAsDouble()); } public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32()); } public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString()); } internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken) { bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (flag) { flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } return flag; } internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken) { JsonToken tokenType = TokenType; if (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { return MoveToContentFromNonContentAsync(cancellationToken); } return AsyncUtils.True; } private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken) { JsonToken tokenType; do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { return false; } tokenType = TokenType; } while (tokenType == JsonToken.None || tokenType == JsonToken.Comment); return true; } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; _maxDepth = 64; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is int) { return (int)value; } int num; if (value is BigInteger bigInteger) { num = (int)bigInteger; } else { try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string? ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[]? ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is double) { return (double)value; } double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger)); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L)); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is decimal) { return (decimal)value; } decimal num; if (value is BigInteger bigInteger) { num = (decimal)bigInteger; } else { try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTimeOffset dateTimeOffset) { SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false); } return (DateTime)Value; case JsonToken.String: return ReadDateTimeString((string)Value); default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTimeOffset? ReadAsDateTimeOffset() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTime dateTime) { SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false); } return (DateTimeOffset)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeOffsetString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal DateTimeOffset? ReadDateTimeOffsetString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract? contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; case ReadType.ReadAsDateTimeOffset: ReadAsDateTimeOffset(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection? _converters; internal IContractResolver _contractResolver; internal ITraceWriter? _traceWriter; internal IEqualityComparer? _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver? _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string? _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver? ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter? TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer? EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting.GetValueOrDefault(); } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling.GetValueOrDefault(); } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling.GetValueOrDefault(); } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling.GetValueOrDefault(); } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling.GetValueOrDefault(); } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent.GetValueOrDefault(); } set { _checkAdditionalContent = value; } } public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs>? Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object? Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T? Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader, Type? objectType) { return DeserializeInternal(reader, objectType); } internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object? value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object? value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object? value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != 0) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter? GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal const int DefaultMaxDepth = 64; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo? _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string? _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal StreamingContext? _context; internal ConstructorHandling? _constructorHandling; internal TypeNameHandling? _typeNameHandling; internal MetadataPropertyHandling? _metadataPropertyHandling; public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public IList<JsonConverter> Converters { get; set; } public PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling.GetValueOrDef
HtmlAgilityPack.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; using System.Xml.XPath; using System.Xml.Xsl; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: CLSCompliant(true)] [assembly: AssemblyTitle("Html Agility Pack - Release")] [assembly: InternalsVisibleTo("HtmlAgilityPack.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010027dc71d8e0b968c7324238e18a4cee4a367f1bf50c9d7a52d91ed46c6a1a584b9142c1d4234c4011d25437c909924079660c434eebe6d2c46412f30520a276e7ca8d8fa7075bb8b9e1c7502ef0e50423b32d469ba750012823fde16989ab42d8428ca5fdd0b06b801788a17239b78e0f75900012a50c5038ab93abbe2ac0d6ee")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("ZZZ Projects Inc.")] [assembly: AssemblyProduct("Html Agility Pack")] [assembly: AssemblyCopyright("Copyright © ZZZ Projects Inc.")] [assembly: AssemblyTrademark("SQL & .NET Tools")] [assembly: ComVisible(true)] [assembly: Guid("643622ea-d2aa-4572-a2b2-6202b7fcd83f")] [assembly: AssemblyFileVersion("1.11.54")] [assembly: AssemblyInformationalVersion("1.11.54")] [assembly: AllowPartiallyTrustedCallers] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyName("")] [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] [assembly: AssemblyVersion("1.11.54.0")] namespace HtmlAgilityPack; [Obsolete("This type should not be used; it is intended for internal use in HTML Agility Pack.")] [CLSCompliant(false)] public class Crc32 { private uint _crc32; private static uint[] crc_32_tab = new uint[256] { 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, 249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u, 498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u, 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u, 997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u, 901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u, 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u, 671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u, 1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u, 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u, 1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u, 1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u, 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u, 1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u, 1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u, 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u, 3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u, 3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u, 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u, 4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u, 3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u, 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u, 3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u, 3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u, 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u, 2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u, 2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u, 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u, 2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u, 2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u, 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u, 3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u }; internal uint CheckSum { get { return _crc32; } set { _crc32 = value; } } public static uint CRC32Bytes(byte[] bytes) { uint num = uint.MaxValue; int num2 = bytes.Length; int num3 = 0; while (num2 > 0) { num2--; num = UPDC32(bytes[num2], num); num3++; } return ~num; } public static uint CRC32String(string text) { uint num = uint.MaxValue; int num2 = text.Length; int num3 = 0; while (num2 > 0) { num2--; char num4 = text[num2]; byte octet = (byte)(num4 & 0xFFu); num = UPDC32((byte)((int)num4 >> 8), num); num = UPDC32(octet, num); num3++; } return ~num; } internal uint AddToCRC32(int c) { return AddToCRC32((ushort)c); } internal uint AddToCRC32(ushort c) { byte octet = (byte)(c & 0xFFu); byte octet2 = (byte)(c >> 8); _crc32 = UPDC32(octet2, _crc32); _crc32 = UPDC32(octet, _crc32); return ~_crc32; } private static uint UPDC32(byte octet, uint crc) { return crc_32_tab[(crc ^ octet) & 0xFF] ^ (crc >> 8); } } internal class EncodingFoundException : Exception { private Encoding _encoding; internal Encoding Encoding => _encoding; internal EncodingFoundException(Encoding encoding) { _encoding = encoding; } } [DebuggerDisplay("Name: {OriginalName}, Value: {Value}")] public class HtmlAttribute : IComparable { private int _line; internal int _lineposition; internal string _name; internal int _namelength; internal int _namestartindex; internal HtmlDocument _ownerdocument; internal HtmlNode _ownernode; private AttributeValueQuote _quoteType = AttributeValueQuote.DoubleQuote; internal int _streamposition; internal string _value; internal int _valuelength; internal int _valuestartindex; internal bool _isFromParse; internal bool _hasEqual; private bool? _localUseOriginalName; public int Line { get { return _line; } internal set { _line = value; } } public int LinePosition => _lineposition; public int ValueStartIndex => _valuestartindex; public int ValueLength => _valuelength; public bool UseOriginalName { get { bool result = false; if (_localUseOriginalName.HasValue) { result = _localUseOriginalName.Value; } else if (OwnerDocument != null) { result = OwnerDocument.OptionDefaultUseOriginalName; } return result; } set { _localUseOriginalName = value; } } public string Name { get { if (_name == null) { _name = _ownerdocument.Text.Substring(_namestartindex, _namelength); } if (!UseOriginalName) { return _name.ToLowerInvariant(); } return _name; } set { if (value == null) { throw new ArgumentNullException("value"); } _name = value; if (_ownernode != null) { _ownernode.SetChanged(); } } } public string OriginalName => _name; public HtmlDocument OwnerDocument => _ownerdocument; public HtmlNode OwnerNode => _ownernode; public AttributeValueQuote QuoteType { get { return _quoteType; } set { _quoteType = value; } } internal AttributeValueQuote InternalQuoteType { get; set; } public int StreamPosition => _streamposition; public string Value { get { if (_value == null && _ownerdocument.Text == null && _valuestartindex == 0 && _valuelength == 0) { return null; } if (_value == null) { _value = _ownerdocument.Text.Substring(_valuestartindex, _valuelength); if (!_ownerdocument.BackwardCompatibility) { _value = HtmlEntity.DeEntitize(_value); } } return _value; } set { _value = value; if (_ownernode != null) { _ownernode.SetChanged(); } } } public string DeEntitizeValue => HtmlEntity.DeEntitize(Value); internal string XmlName => HtmlDocument.GetXmlName(Name, isAttribute: true, OwnerDocument.OptionPreserveXmlNamespaces); internal string XmlValue => Value; public string XPath => ((OwnerNode == null) ? "/" : (OwnerNode.XPath + "/")) + GetRelativeXpath(); internal HtmlAttribute(HtmlDocument ownerdocument) { _ownerdocument = ownerdocument; } public int CompareTo(object obj) { if (!(obj is HtmlAttribute htmlAttribute)) { throw new ArgumentException("obj"); } return Name.CompareTo(htmlAttribute.Name); } public HtmlAttribute Clone() { return new HtmlAttribute(_ownerdocument) { Name = OriginalName, Value = Value, QuoteType = QuoteType, InternalQuoteType = InternalQuoteType, _isFromParse = _isFromParse, _hasEqual = _hasEqual }; } public void Remove() { _ownernode.Attributes.Remove(this); } private string GetRelativeXpath() { if (OwnerNode == null) { return Name; } int num = 1; foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)OwnerNode.Attributes) { if (!(item.Name != Name)) { if (item == this) { break; } num++; } } return "@" + Name + "[" + num + "]"; } } public enum AttributeValueQuote { SingleQuote, DoubleQuote, None, WithoutValue, Initial } public class HtmlAttributeCollection : IList<HtmlAttribute>, ICollection<HtmlAttribute>, IEnumerable<HtmlAttribute>, IEnumerable { internal Dictionary<string, HtmlAttribute> Hashitems = new Dictionary<string, HtmlAttribute>(StringComparer.OrdinalIgnoreCase); private HtmlNode _ownernode; internal List<HtmlAttribute> items = new List<HtmlAttribute>(); public int Count => items.Count; public bool IsReadOnly => false; public HtmlAttribute this[int index] { get { return items[index]; } set { HtmlAttribute htmlAttribute = items[index]; items[index] = value; if (htmlAttribute.Name != value.Name) { Hashitems.Remove(htmlAttribute.Name); } Hashitems[value.Name] = value; value._ownernode = _ownernode; _ownernode.SetChanged(); } } public HtmlAttribute this[string name] { get { if (name == null) { throw new ArgumentNullException("name"); } if (!Hashitems.TryGetValue(name, out var value)) { return null; } return value; } set { if (!Hashitems.TryGetValue(name, out var value2)) { Append(value); } else { this[items.IndexOf(value2)] = value; } } } internal HtmlAttributeCollection(HtmlNode ownernode) { _ownernode = ownernode; } public void Add(string name, string value) { Append(name, value); } public void Add(HtmlAttribute item) { Append(item); } public void AddRange(IEnumerable<HtmlAttribute> items) { foreach (HtmlAttribute item in items) { Append(item); } } public void AddRange(Dictionary<string, string> items) { foreach (KeyValuePair<string, string> item in items) { Add(item.Key, item.Value); } } void ICollection<HtmlAttribute>.Clear() { Clear(); } public bool Contains(HtmlAttribute item) { return items.Contains(item); } public void CopyTo(HtmlAttribute[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); } IEnumerator<HtmlAttribute> IEnumerable<HtmlAttribute>.GetEnumerator() { return items.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return items.GetEnumerator(); } public int IndexOf(HtmlAttribute item) { return items.IndexOf(item); } public void Insert(int index, HtmlAttribute item) { if (item == null) { throw new ArgumentNullException("item"); } Hashitems[item.Name] = item; item._ownernode = _ownernode; items.Insert(index, item); _ownernode.SetChanged(); } bool ICollection<HtmlAttribute>.Remove(HtmlAttribute item) { if (item == null) { return false; } int attributeIndex = GetAttributeIndex(item); if (attributeIndex == -1) { return false; } RemoveAt(attributeIndex); return true; } public void RemoveAt(int index) { HtmlAttribute htmlAttribute = items[index]; Hashitems.Remove(htmlAttribute.Name); items.RemoveAt(index); _ownernode.SetChanged(); } public HtmlAttribute Append(HtmlAttribute newAttribute) { if (_ownernode.NodeType == HtmlNodeType.Text || _ownernode.NodeType == HtmlNodeType.Comment) { throw new Exception("A Text or Comment node cannot have attributes."); } if (newAttribute == null) { throw new ArgumentNullException("newAttribute"); } Hashitems[newAttribute.Name] = newAttribute; newAttribute._ownernode = _ownernode; items.Add(newAttribute); _ownernode.SetChanged(); return newAttribute; } public HtmlAttribute Append(string name) { HtmlAttribute newAttribute = _ownernode._ownerdocument.CreateAttribute(name); return Append(newAttribute); } public HtmlAttribute Append(string name, string value) { HtmlAttribute newAttribute = _ownernode._ownerdocument.CreateAttribute(name, value); return Append(newAttribute); } public bool Contains(string name) { for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, name, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } public HtmlAttribute Prepend(HtmlAttribute newAttribute) { Insert(0, newAttribute); return newAttribute; } public void Remove(HtmlAttribute attribute) { if (attribute == null) { throw new ArgumentNullException("attribute"); } int attributeIndex = GetAttributeIndex(attribute); if (attributeIndex == -1) { throw new IndexOutOfRangeException(); } RemoveAt(attributeIndex); } public void Remove(string name) { if (name == null) { throw new ArgumentNullException("name"); } for (int num = items.Count - 1; num >= 0; num--) { if (string.Equals(items[num].Name, name, StringComparison.OrdinalIgnoreCase)) { RemoveAt(num); } } } public void RemoveAll() { Hashitems.Clear(); items.Clear(); _ownernode.SetChanged(); } public IEnumerable<HtmlAttribute> AttributesWithName(string attributeName) { for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, attributeName, StringComparison.OrdinalIgnoreCase)) { yield return items[i]; } } } public void Remove() { items.Clear(); } internal void Clear() { Hashitems.Clear(); items.Clear(); } internal int GetAttributeIndex(HtmlAttribute attribute) { if (attribute == null) { throw new ArgumentNullException("attribute"); } for (int i = 0; i < items.Count; i++) { if (items[i] == attribute) { return i; } } return -1; } internal int GetAttributeIndex(string name) { if (name == null) { throw new ArgumentNullException("name"); } for (int i = 0; i < items.Count; i++) { if (string.Equals(items[i].Name, name, StringComparison.OrdinalIgnoreCase)) { return i; } } return -1; } } internal class HtmlCmdLine { internal static bool Help; static HtmlCmdLine() { Help = false; ParseArgs(); } internal static string GetOption(string name, string def) { string ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetStringArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } internal static string GetOption(int index, string def) { string ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); int num = 0; for (int i = 1; i < commandLineArgs.Length; i++) { if (GetStringArg(commandLineArgs[i], ref ArgValue)) { if (index == num) { return ArgValue; } ArgValue = def; num++; } } return ArgValue; } internal static bool GetOption(string name, bool def) { bool ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetBoolArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } internal static int GetOption(string name, int def) { int ArgValue = def; string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetIntArg(commandLineArgs[i], name, ref ArgValue); } return ArgValue; } private static void GetBoolArg(string Arg, string Name, ref bool ArgValue) { if (Arg.Length >= Name.Length + 1 && ('/' == Arg[0] || '-' == Arg[0]) && Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant()) { ArgValue = true; } } private static void GetIntArg(string Arg, string Name, ref int ArgValue) { if (Arg.Length < Name.Length + 3 || ('/' != Arg[0] && '-' != Arg[0]) || !(Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant())) { return; } try { ArgValue = Convert.ToInt32(Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2)); } catch { } } private static bool GetStringArg(string Arg, ref string ArgValue) { if ('/' == Arg[0] || '-' == Arg[0]) { return false; } ArgValue = Arg; return true; } private static void GetStringArg(string Arg, string Name, ref string ArgValue) { if (Arg.Length >= Name.Length + 3 && ('/' == Arg[0] || '-' == Arg[0]) && Arg.Substring(1, Name.Length).ToLowerInvariant() == Name.ToLowerInvariant()) { ArgValue = Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2); } } private static void ParseArgs() { string[] commandLineArgs = Environment.GetCommandLineArgs(); for (int i = 1; i < commandLineArgs.Length; i++) { GetBoolArg(commandLineArgs[i], "?", ref Help); GetBoolArg(commandLineArgs[i], "h", ref Help); GetBoolArg(commandLineArgs[i], "help", ref Help); } } } public class HtmlCommentNode : HtmlNode { private string _comment; public string Comment { get { if (_comment == null) { return base.InnerHtml; } return _comment; } set { _comment = value; } } public override string InnerHtml { get { if (_comment == null) { return base.InnerHtml; } return _comment; } set { _comment = value; } } public override string OuterHtml { get { if (_comment == null) { return base.OuterHtml; } return "<!--" + _comment + "-->"; } } internal HtmlCommentNode(HtmlDocument ownerdocument, int index) : base(HtmlNodeType.Comment, ownerdocument, index) { } } internal class HtmlConsoleListener : TraceListener { public override void Write(string Message) { Write(Message, ""); } public override void Write(string Message, string Category) { Console.Write("T:" + Category + ": " + Message); } public override void WriteLine(string Message) { Write(Message + "\n"); } public override void WriteLine(string Message, string Category) { Write(Message + "\n", Category); } } public class HtmlDocument : IXPathNavigable { private enum ParseState { Text, WhichTag, Tag, BetweenAttributes, EmptyTag, AttributeName, AttributeBeforeEquals, AttributeAfterEquals, AttributeValue, Comment, QuotedAttributeValue, ServerSideCode, PcData } internal static bool _disableBehaviorTagP = true; private static int _maxDepthLevel = int.MaxValue; private int _c; private Crc32 _crc32; private HtmlAttribute _currentattribute; private HtmlNode _currentnode; private Encoding _declaredencoding; private HtmlNode _documentnode; private bool _fullcomment; private int _index; internal Dictionary<string, HtmlNode> Lastnodes = new Dictionary<string, HtmlNode>(); private HtmlNode _lastparentnode; private int _line; private int _lineposition; private int _maxlineposition; internal Dictionary<string, HtmlNode> Nodesid; private ParseState _oldstate; private bool _onlyDetectEncoding; internal Dictionary<int, HtmlNode> Openednodes; private List<HtmlParseError> _parseerrors = new List<HtmlParseError>(); private string _remainder; private int _remainderOffset; private ParseState _state; private Encoding _streamencoding; private bool _useHtmlEncodingForStream; public string Text; public bool BackwardCompatibility = true; public bool OptionAddDebuggingAttributes; public bool OptionAutoCloseOnEnd; public bool OptionCheckSyntax = true; public bool OptionComputeChecksum; public bool OptionEmptyCollection; public bool DisableServerSideCode; public Encoding OptionDefaultStreamEncoding; public bool OptionXmlForceOriginalComment; public bool OptionExtractErrorSourceText; public int OptionExtractErrorSourceTextMaxLength = 100; public bool OptionFixNestedTags; public bool OptionOutputAsXml; public bool OptionPreserveXmlNamespaces; public bool OptionOutputOptimizeAttributeValues; public AttributeValueQuote? GlobalAttributeValueQuote; public bool OptionOutputOriginalCase; public bool OptionOutputUpperCase; public bool OptionReadEncoding = true; public string OptionStopperNodeName; public bool OptionDefaultUseOriginalName; public bool OptionUseIdAttribute = true; public bool OptionWriteEmptyNodes; public int OptionMaxNestedChildNodes; internal static readonly string HtmlExceptionRefNotChild = "Reference node must be a child of this node"; internal static readonly string HtmlExceptionUseIdAttributeFalse = "You need to set UseIdAttribute property to true to enable this feature"; internal static readonly string HtmlExceptionClassDoesNotExist = "Class name doesn't exist"; internal static readonly string HtmlExceptionClassExists = "Class name already exists"; internal static readonly Dictionary<string, string[]> HtmlResetters = new Dictionary<string, string[]> { { "li", new string[2] { "ul", "ol" } }, { "tr", new string[1] { "table" } }, { "th", new string[2] { "tr", "table" } }, { "td", new string[2] { "tr", "table" } } }; private static List<string> BlockAttributes = new List<string> { "\"", "'" }; public static bool DisableBehaviorTagP { get { return _disableBehaviorTagP; } set { if (value) { if (HtmlNode.ElementsFlags.ContainsKey("p")) { HtmlNode.ElementsFlags.Remove("p"); } } else if (!HtmlNode.ElementsFlags.ContainsKey("p")) { HtmlNode.ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed); } _disableBehaviorTagP = value; } } public static Action<HtmlDocument> DefaultBuilder { get; set; } public Action<HtmlDocument> ParseExecuting { get; set; } public string ParsedText => Text; public static int MaxDepthLevel { get { return _maxDepthLevel; } set { _maxDepthLevel = value; } } public int CheckSum { get { if (_crc32 != null) { return (int)_crc32.CheckSum; } return 0; } } public Encoding DeclaredEncoding => _declaredencoding; public HtmlNode DocumentNode => _documentnode; public Encoding Encoding => GetOutEncoding(); public IEnumerable<HtmlParseError> ParseErrors => _parseerrors; public string Remainder => _remainder; public int RemainderOffset => _remainderOffset; public Encoding StreamEncoding => _streamencoding; public HtmlDocument() { if (DefaultBuilder != null) { DefaultBuilder(this); } _documentnode = CreateNode(HtmlNodeType.Document, 0); OptionDefaultStreamEncoding = Encoding.Default; } public static string GetXmlName(string name) { return GetXmlName(name, isAttribute: false, preserveXmlNamespaces: false); } public void UseAttributeOriginalName(string tagName) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)DocumentNode.SelectNodes("//" + tagName)) { foreach (HtmlAttribute item2 in (IEnumerable<HtmlAttribute>)item.Attributes) { item2.UseOriginalName = true; } } } public static string GetXmlName(string name, bool isAttribute, bool preserveXmlNamespaces) { string text = string.Empty; bool flag = true; for (int i = 0; i < name.Length; i++) { if ((name[i] >= 'a' && name[i] <= 'z') || (name[i] >= 'A' && name[i] <= 'Z') || (name[i] >= '0' && name[i] <= '9') || ((isAttribute || preserveXmlNamespaces) && name[i] == ':') || name[i] == '_' || name[i] == '-' || name[i] == '.') { text += name[i]; continue; } flag = false; byte[] bytes = Encoding.UTF8.GetBytes(new char[1] { name[i] }); for (int j = 0; j < bytes.Length; j++) { text += bytes[j].ToString("x2"); } text += "_"; } if (flag) { return text; } return "_" + text; } public static string HtmlEncode(string html) { return HtmlEncodeWithCompatibility(html); } internal static string HtmlEncodeWithCompatibility(string html, bool backwardCompatibility = true) { if (html == null) { throw new ArgumentNullException("html"); } return (backwardCompatibility ? new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;))", RegexOptions.IgnoreCase) : new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;)|(nbsp;)|(reg;))", RegexOptions.IgnoreCase)).Replace(html, "&").Replace("<", "<").Replace(">", ">") .Replace("\"", """); } public static bool IsWhiteSpace(int c) { if (c == 10 || c == 13 || c == 32 || c == 9) { return true; } return false; } public HtmlAttribute CreateAttribute(string name) { if (name == null) { throw new ArgumentNullException("name"); } HtmlAttribute htmlAttribute = CreateAttribute(); htmlAttribute.Name = name; return htmlAttribute; } public HtmlAttribute CreateAttribute(string name, string value) { if (name == null) { throw new ArgumentNullException("name"); } HtmlAttribute htmlAttribute = CreateAttribute(name); htmlAttribute.Value = value; return htmlAttribute; } public HtmlCommentNode CreateComment() { return (HtmlCommentNode)CreateNode(HtmlNodeType.Comment); } public HtmlCommentNode CreateComment(string comment) { if (comment == null) { throw new ArgumentNullException("comment"); } HtmlCommentNode htmlCommentNode = CreateComment(); htmlCommentNode.Comment = comment; return htmlCommentNode; } public HtmlNode CreateElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } HtmlNode htmlNode = CreateNode(HtmlNodeType.Element); htmlNode.SetName(name); return htmlNode; } public HtmlTextNode CreateTextNode() { return (HtmlTextNode)CreateNode(HtmlNodeType.Text); } public HtmlTextNode CreateTextNode(string text) { if (text == null) { throw new ArgumentNullException("text"); } HtmlTextNode htmlTextNode = CreateTextNode(); htmlTextNode.Text = text; return htmlTextNode; } public Encoding DetectEncoding(Stream stream) { return DetectEncoding(stream, checkHtml: false); } public Encoding DetectEncoding(Stream stream, bool checkHtml) { _useHtmlEncodingForStream = checkHtml; if (stream == null) { throw new ArgumentNullException("stream"); } return DetectEncoding(new StreamReader(stream)); } public Encoding DetectEncoding(TextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } _onlyDetectEncoding = true; if (OptionCheckSyntax) { Openednodes = new Dictionary<int, HtmlNode>(); } else { Openednodes = null; } if (OptionUseIdAttribute) { Nodesid = new Dictionary<string, HtmlNode>(StringComparer.OrdinalIgnoreCase); } else { Nodesid = null; } if (reader is StreamReader streamReader && !_useHtmlEncodingForStream) { Text = streamReader.ReadToEnd(); _streamencoding = streamReader.CurrentEncoding; return _streamencoding; } _streamencoding = null; _declaredencoding = null; Text = reader.ReadToEnd(); _documentnode = CreateNode(HtmlNodeType.Document, 0); try { Parse(); } catch (EncodingFoundException ex) { return ex.Encoding; } return _streamencoding; } public Encoding DetectEncodingHtml(string html) { if (html == null) { throw new ArgumentNullException("html"); } using StringReader reader = new StringReader(html); return DetectEncoding(reader); } public HtmlNode GetElementbyId(string id) { if (id == null) { throw new ArgumentNullException("id"); } if (Nodesid == null) { throw new Exception(HtmlExceptionUseIdAttributeFalse); } if (!Nodesid.ContainsKey(id)) { return null; } return Nodesid[id]; } public void Load(Stream stream) { Load(new StreamReader(stream, OptionDefaultStreamEncoding)); } public void Load(Stream stream, bool detectEncodingFromByteOrderMarks) { Load(new StreamReader(stream, detectEncodingFromByteOrderMarks)); } public void Load(Stream stream, Encoding encoding) { Load(new StreamReader(stream, encoding)); } public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks) { Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks)); } public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize) { Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize)); } public void Load(TextReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } _onlyDetectEncoding = false; if (OptionCheckSyntax) { Openednodes = new Dictionary<int, HtmlNode>(); } else { Openednodes = null; } if (OptionUseIdAttribute) { Nodesid = new Dictionary<string, HtmlNode>(StringComparer.OrdinalIgnoreCase); } else { Nodesid = null; } if (reader is StreamReader streamReader) { try { streamReader.Peek(); } catch (Exception) { } _streamencoding = streamReader.CurrentEncoding; } else { _streamencoding = null; } _declaredencoding = null; Text = reader.ReadToEnd(); _documentnode = CreateNode(HtmlNodeType.Document, 0); Parse(); if (!OptionCheckSyntax || Openednodes == null) { return; } foreach (HtmlNode value in Openednodes.Values) { if (!value._starttag) { continue; } string text; if (OptionExtractErrorSourceText) { text = value.OuterHtml; if (text.Length > OptionExtractErrorSourceTextMaxLength) { text = text.Substring(0, OptionExtractErrorSourceTextMaxLength); } } else { text = string.Empty; } AddError(HtmlParseErrorCode.TagNotClosed, value._line, value._lineposition, value._streamposition, text, "End tag </" + value.Name + "> was not found"); } Openednodes.Clear(); } public void LoadHtml(string html) { if (html == null) { throw new ArgumentNullException("html"); } using StringReader reader = new StringReader(html); Load(reader); } public void Save(Stream outStream) { StreamWriter writer = new StreamWriter(outStream, GetOutEncoding()); Save(writer); } public void Save(Stream outStream, Encoding encoding) { if (outStream == null) { throw new ArgumentNullException("outStream"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } StreamWriter writer = new StreamWriter(outStream, encoding); Save(writer); } public void Save(StreamWriter writer) { Save((TextWriter)writer); } public void Save(TextWriter writer) { if (writer == null) { throw new ArgumentNullException("writer"); } DocumentNode.WriteTo(writer); writer.Flush(); } public void Save(XmlWriter writer) { DocumentNode.WriteTo(writer); writer.Flush(); } internal HtmlAttribute CreateAttribute() { return new HtmlAttribute(this); } internal HtmlNode CreateNode(HtmlNodeType type) { return CreateNode(type, -1); } internal HtmlNode CreateNode(HtmlNodeType type, int index) { return type switch { HtmlNodeType.Comment => new HtmlCommentNode(this, index), HtmlNodeType.Text => new HtmlTextNode(this, index), _ => new HtmlNode(type, this, index), }; } internal Encoding GetOutEncoding() { return _declaredencoding ?? _streamencoding ?? OptionDefaultStreamEncoding; } internal HtmlNode GetXmlDeclaration() { if (!_documentnode.HasChildNodes) { return null; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)_documentnode._childnodes) { if (item.Name == "?xml") { return item; } } return null; } internal void SetIdForNode(HtmlNode node, string id) { if (OptionUseIdAttribute && Nodesid != null && id != null) { if (node == null) { Nodesid.Remove(id); } else { Nodesid[id] = node; } } } internal void UpdateLastParentNode() { do { if (_lastparentnode.Closed) { _lastparentnode = _lastparentnode.ParentNode; } } while (_lastparentnode != null && _lastparentnode.Closed); if (_lastparentnode == null) { _lastparentnode = _documentnode; } } private void AddError(HtmlParseErrorCode code, int line, int linePosition, int streamPosition, string sourceText, string reason) { HtmlParseError item = new HtmlParseError(code, line, linePosition, streamPosition, sourceText, reason); _parseerrors.Add(item); } private void CloseCurrentNode() { if (_currentnode.Closed) { return; } bool flag = false; HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); if (dictionaryValueOrDefault == null) { if (HtmlNode.IsClosedElement(_currentnode.Name)) { _currentnode.CloseNode(_currentnode); if (_lastparentnode != null) { HtmlNode htmlNode = null; Stack<HtmlNode> stack = new Stack<HtmlNode>(); if (!_currentnode.Name.Equals("br")) { for (HtmlNode htmlNode2 = _lastparentnode.LastChild; htmlNode2 != null; htmlNode2 = htmlNode2.PreviousSibling) { if (htmlNode2.Name == _currentnode.Name && !htmlNode2.HasChildNodes) { htmlNode = htmlNode2; break; } stack.Push(htmlNode2); } } if (htmlNode != null) { while (stack.Count != 0) { HtmlNode htmlNode3 = stack.Pop(); _lastparentnode.RemoveChild(htmlNode3); htmlNode.AppendChild(htmlNode3); } } else { _lastparentnode.AppendChild(_currentnode); } } } else if (HtmlNode.CanOverlapElement(_currentnode.Name)) { HtmlNode htmlNode4 = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex); htmlNode4._outerlength = _currentnode._outerlength; ((HtmlTextNode)htmlNode4).Text = ((HtmlTextNode)htmlNode4).Text.ToLowerInvariant(); if (_lastparentnode != null) { _lastparentnode.AppendChild(htmlNode4); } } else if (HtmlNode.IsEmptyElement(_currentnode.Name)) { AddError(HtmlParseErrorCode.EndTagNotRequired, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "End tag </" + _currentnode.Name + "> is not required"); } else { AddError(HtmlParseErrorCode.TagNotOpened, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "Start tag <" + _currentnode.Name + "> was not found"); flag = true; } } else { if (OptionFixNestedTags && FindResetterNodes(dictionaryValueOrDefault, GetResetters(_currentnode.Name))) { AddError(HtmlParseErrorCode.EndTagInvalidHere, _currentnode._line, _currentnode._lineposition, _currentnode._streamposition, _currentnode.OuterHtml, "End tag </" + _currentnode.Name + "> invalid here"); flag = true; } if (!flag) { Lastnodes[_currentnode.Name] = dictionaryValueOrDefault._prevwithsamename; dictionaryValueOrDefault.CloseNode(_currentnode); } } if (!flag && _lastparentnode != null && (!HtmlNode.IsClosedElement(_currentnode.Name) || _currentnode._starttag)) { UpdateLastParentNode(); } } private string CurrentNodeName() { return Text.Substring(_currentnode._namestartindex, _currentnode._namelength); } private void DecrementPosition() { _index--; if (_lineposition == 0) { _lineposition = _maxlineposition; _line--; } else { _lineposition--; } } private HtmlNode FindResetterNode(HtmlNode node, string name) { HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, name); if (dictionaryValueOrDefault == null) { return null; } if (dictionaryValueOrDefault.Closed) { return null; } if (dictionaryValueOrDefault._streamposition < node._streamposition) { return null; } return dictionaryValueOrDefault; } private bool FindResetterNodes(HtmlNode node, string[] names) { if (names == null) { return false; } for (int i = 0; i < names.Length; i++) { if (FindResetterNode(node, names[i]) != null) { return true; } } return false; } private void FixNestedTag(string name, string[] resetters) { if (resetters != null) { HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); if (dictionaryValueOrDefault != null && !Lastnodes[name].Closed && !FindResetterNodes(dictionaryValueOrDefault, resetters)) { HtmlNode htmlNode = new HtmlNode(dictionaryValueOrDefault.NodeType, this, -1); htmlNode._endnode = htmlNode; dictionaryValueOrDefault.CloseNode(htmlNode); } } } private void FixNestedTags() { if (_currentnode._starttag) { string name = CurrentNodeName(); FixNestedTag(name, GetResetters(name)); } } private string[] GetResetters(string name) { if (!HtmlResetters.TryGetValue(name, out var value)) { return null; } return value; } private void IncrementPosition() { if (_crc32 != null) { _crc32.AddToCRC32(_c); } _index++; _maxlineposition = _lineposition; if (_c == 10) { _lineposition = 0; _line++; } else { _lineposition++; } } private bool IsValidTag() { if (_c == 60 && _index < Text.Length) { if (!char.IsLetter(Text[_index]) && Text[_index] != '/' && Text[_index] != '?' && Text[_index] != '!') { return Text[_index] == '%'; } return true; } return false; } private bool NewCheck() { if (_c != 60 || !IsValidTag()) { return false; } if (_index < Text.Length && Text[_index] == '%') { if (DisableServerSideCode) { return false; } switch (_state) { case ParseState.AttributeAfterEquals: PushAttributeValueStart(_index - 1); break; case ParseState.BetweenAttributes: PushAttributeNameStart(_index - 1, _lineposition - 1); break; case ParseState.WhichTag: PushNodeNameStart(starttag: true, _index - 1); _state = ParseState.Tag; break; } _oldstate = _state; _state = ParseState.ServerSideCode; return true; } if (!PushNodeEnd(_index - 1, close: true)) { _index = Text.Length; return true; } _state = ParseState.WhichTag; if (_index - 1 <= Text.Length - 2 && (Text[_index] == '!' || Text[_index] == '?')) { PushNodeStart(HtmlNodeType.Comment, _index - 1, _lineposition - 1); PushNodeNameStart(starttag: true, _index); PushNodeNameEnd(_index + 1); _state = ParseState.Comment; if (_index < Text.Length - 2) { if (Text[_index + 1] == '-' && Text[_index + 2] == '-') { _fullcomment = true; } else { _fullcomment = false; } } return true; } PushNodeStart(HtmlNodeType.Element, _index - 1, _lineposition - 1); return true; } private void Parse() { if (ParseExecuting != null) { ParseExecuting(this); } int num = 0; if (OptionComputeChecksum) { _crc32 = new Crc32(); } Lastnodes = new Dictionary<string, HtmlNode>(); _c = 0; _fullcomment = false; _parseerrors = new List<HtmlParseError>(); _line = 1; _lineposition = 0; _maxlineposition = 0; _state = ParseState.Text; _oldstate = _state; _documentnode._innerlength = Text.Length; _documentnode._outerlength = Text.Length; _remainderOffset = Text.Length; _lastparentnode = _documentnode; _currentnode = CreateNode(HtmlNodeType.Text, 0); _currentattribute = null; _index = 0; PushNodeStart(HtmlNodeType.Text, 0, _lineposition); while (_index < Text.Length) { _c = Text[_index]; IncrementPosition(); switch (_state) { case ParseState.Text: if (!NewCheck()) { } break; case ParseState.WhichTag: if (!NewCheck()) { if (_c == 47) { PushNodeNameStart(starttag: false, _index); } else { PushNodeNameStart(starttag: true, _index - 1); DecrementPosition(); } _state = ParseState.Tag; } break; case ParseState.Tag: if (NewCheck()) { break; } if (IsWhiteSpace(_c)) { CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { _state = ParseState.BetweenAttributes; } } else if (_c == 47) { CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { _state = ParseState.EmptyTag; } } else { if (_c != 62) { break; } CloseParentImplicitExplicitNode(); PushNodeNameEnd(_index - 1); if (_state == ParseState.Tag) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.Tag) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } } break; case ParseState.BetweenAttributes: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 47 || _c == 63) { _state = ParseState.EmptyTag; } else if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.BetweenAttributes) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else { PushAttributeNameStart(_index - 1, _lineposition - 1); _state = ParseState.AttributeName; } break; case ParseState.EmptyTag: if (NewCheck()) { break; } if (_c == 62) { if (!PushNodeEnd(_index, close: true)) { _index = Text.Length; } else if (_state == ParseState.EmptyTag) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else if (!IsWhiteSpace(_c)) { DecrementPosition(); _state = ParseState.BetweenAttributes; } else { _state = ParseState.BetweenAttributes; } break; case ParseState.AttributeName: if (NewCheck()) { break; } _currentattribute._isFromParse = true; if (_c == 47) { PushAttributeNameEnd(_index - 1); _state = ParseState.AttributeBeforeEquals; } else if (IsWhiteSpace(_c)) { PushAttributeNameEnd(_index - 1); _state = ParseState.AttributeBeforeEquals; } else if (_c == 61) { PushAttributeNameEnd(_index - 1); _currentattribute._hasEqual = true; _state = ParseState.AttributeAfterEquals; } else if (_c == 62) { PushAttributeNameEnd(_index - 1); if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeName) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } break; case ParseState.AttributeBeforeEquals: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeBeforeEquals) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else if (_c == 61) { _currentattribute._hasEqual = true; _state = ParseState.AttributeAfterEquals; } else { _state = ParseState.BetweenAttributes; DecrementPosition(); } break; case ParseState.AttributeAfterEquals: if (NewCheck() || IsWhiteSpace(_c)) { break; } if (_c == 39 || _c == 34) { _state = ParseState.QuotedAttributeValue; PushAttributeValueStart(_index, _c); num = _c; } else if (_c == 62) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeAfterEquals) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } else { PushAttributeValueStart(_index - 1); _state = ParseState.AttributeValue; } break; case ParseState.AttributeValue: if (NewCheck()) { break; } if (IsWhiteSpace(_c)) { PushAttributeValueEnd(_index - 1); _state = ParseState.BetweenAttributes; } else if (_c == 62) { PushAttributeValueEnd(_index - 1); if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; } else if (_state == ParseState.AttributeValue) { _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } } break; case ParseState.QuotedAttributeValue: if (_c == num) { PushAttributeValueEnd(_index - 1); _state = ParseState.BetweenAttributes; } else if (_c == 60 && _index < Text.Length && Text[_index] == '%') { _oldstate = _state; _state = ParseState.ServerSideCode; } break; case ParseState.Comment: if (_c == 62 && (!_fullcomment || (Text[_index - 2] == '-' && Text[_index - 3] == '-') || (Text[_index - 2] == '!' && Text[_index - 3] == '-' && Text[_index - 4] == '-'))) { if (!PushNodeEnd(_index, close: false)) { _index = Text.Length; break; } _state = ParseState.Text; PushNodeStart(HtmlNodeType.Text, _index, _lineposition); } break; case ParseState.ServerSideCode: if (_c == 37) { if (_index < Text.Length && Text[_index] == '>') { switch (_oldstate) { case ParseState.AttributeAfterEquals: _state = ParseState.AttributeValue; break; case ParseState.BetweenAttributes: PushAttributeNameEnd(_index + 1); _state = ParseState.BetweenAttributes; break; default: _state = _oldstate; break; } IncrementPosition(); } } else if (_oldstate == ParseState.QuotedAttributeValue && _c == num) { _state = _oldstate; DecrementPosition(); } break; case ParseState.PcData: { if (_currentnode._namelength + 3 > Text.Length - (_index - 1) || string.Compare(Text.Substring(_index - 1, _currentnode._namelength + 2), "</" + _currentnode.Name, StringComparison.OrdinalIgnoreCase) != 0) { break; } int num2 = Text[_index - 1 + 2 + _currentnode.Name.Length]; if (num2 == 62 || IsWhiteSpace(num2)) { HtmlNode htmlNode = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex + _currentnode._outerlength); htmlNode._outerlength = _index - 1 - htmlNode._outerstartindex; htmlNode._streamposition = htmlNode._outerstartindex; htmlNode._line = _currentnode.Line; htmlNode._lineposition = _currentnode.LinePosition + _currentnode._namelength + 2; _currentnode.AppendChild(htmlNode); if (_currentnode.Name.ToLowerInvariant().Equals("script") || _currentnode.Name.ToLowerInvariant().Equals("style")) { _currentnode._isHideInnerText = true; } PushNodeStart(HtmlNodeType.Element, _index - 1, _lineposition - 1); PushNodeNameStart(starttag: false, _index - 1 + 2); _state = ParseState.Tag; IncrementPosition(); } break; } } } if (_currentnode._namestartindex > 0) { PushNodeNameEnd(_index); } PushNodeEnd(_index, close: false); Lastnodes.Clear(); } private void PushAttributeNameEnd(int index) { _currentattribute._namelength = index - _currentattribute._namestartindex; if (_currentattribute.Name != null && !BlockAttributes.Contains(_currentattribute.Name)) { _currentnode.Attributes.Append(_currentattribute); } } private void PushAttributeNameStart(int index, int lineposition) { _currentattribute = CreateAttribute(); _currentattribute._namestartindex = index; _currentattribute.Line = _line; _currentattribute._lineposition = lineposition; _currentattribute._streamposition = index; } private void PushAttributeValueEnd(int index) { _currentattribute._valuelength = index - _currentattribute._valuestartindex; } private void PushAttributeValueStart(int index) { PushAttributeValueStart(index, 0); } private void CloseParentImplicitExplicitNode() { bool flag = true; while (flag && !_lastparentnode.Closed) { flag = false; bool flag2 = false; if (IsParentImplicitEnd()) { if (OptionOutputAsXml) { flag2 = true; } else { CloseParentImplicitEnd(); flag = true; } } if (flag2 || IsParentExplicitEnd()) { CloseParentExplicitEnd(); flag = true; } } } private bool IsParentImplicitEnd() { if (!_currentnode._starttag) { return false; } bool result = false; string name = _lastparentnode.Name; string text = Text.Substring(_currentnode._namestartindex, _index - _currentnode._namestartindex - 1).ToLowerInvariant(); switch (name) { case "a": result = text == "a"; break; case "dd": result = text == "dt" || text == "dd"; break; case "dt": result = text == "dt" || text == "dd"; break; case "li": result = text == "li"; break; case "p": if (DisableBehaviorTagP) { int num; switch (text) { default: num = ((text == "ul") ? 1 : 0); break; case "address": case "article": case "aside": case "blockquote": case "dir": case "div": case "dl": case "fieldset": case "footer": case "form": case "h1": case "h2": case "h3": case "h4": case "h5": case "h6": case "header": case "hr": case "li": case "menu": case "nav": case "ol": case "p": case "pre": case "section": case "table": num = 1; break; } result = (byte)num != 0; } else { result = text == "p"; } break; case "option": result = text == "option"; break; } return result; } private bool IsParentExplicitEnd() { if (!_currentnode._starttag) { return false; } bool result = false; string name = _lastparentnode.Name; string text = Text.Substring(_currentnode._namestartindex, _index - _currentnode._namestartindex - 1).ToLowerInvariant(); switch (name) { case "title": result = text == "title"; break; case "p": result = text == "div"; break; case "table": result = text == "table"; break; case "tr": result = text == "tr"; break; case "td": result = text == "td" || text == "th" || text == "tr"; break; case "th": result = text == "td" || text == "th" || text == "tr"; break; case "h1": { int num5; switch (text) { default: num5 = ((text == "h5") ? 1 : 0); break; case "h2": case "h3": case "h4": num5 = 1; break; } result = (byte)num5 != 0; break; } case "h2": { int num4; switch (text) { default: num4 = ((text == "h5") ? 1 : 0); break; case "h1": case "h3": case "h4": num4 = 1; break; } result = (byte)num4 != 0; break; } case "h3": { int num3; switch (text) { default: num3 = ((text == "h5") ? 1 : 0); break; case "h1": case "h2": case "h4": num3 = 1; break; } result = (byte)num3 != 0; break; } case "h4": { int num2; switch (text) { default: num2 = ((text == "h5") ? 1 : 0); break; case "h1": case "h2": case "h3": num2 = 1; break; } result = (byte)num2 != 0; break; } case "h5": { int num; switch (text) { default: num = ((text == "h4") ? 1 : 0); break; case "h1": case "h2": case "h3": num = 1; break; } result = (byte)num != 0; break; } } return result; } private void CloseParentImplicitEnd() { HtmlNode htmlNode = new HtmlNode(_lastparentnode.NodeType, this, -1); htmlNode._endnode = htmlNode; htmlNode._isImplicitEnd = true; _lastparentnode._isImplicitEnd = true; _lastparentnode.CloseNode(htmlNode); } private void CloseParentExplicitEnd() { HtmlNode htmlNode = new HtmlNode(_lastparentnode.NodeType, this, -1); htmlNode._endnode = htmlNode; _lastparentnode.CloseNode(htmlNode); } private void PushAttributeValueStart(int index, int quote) { _currentattribute._valuestartindex = index; if (quote == 39) { _currentattribute.QuoteType = AttributeValueQuote.SingleQuote; } _currentattribute.InternalQuoteType = _currentattribute.QuoteType; if (quote == 0) { _currentattribute.InternalQuoteType = AttributeValueQuote.None; } } private bool PushNodeEnd(int index, bool close) { _currentnode._outerlength = index - _currentnode._outerstartindex; if (_currentnode._nodetype == HtmlNodeType.Text || _currentnode._nodetype == HtmlNodeType.Comment) { if (_currentnode._outerlength > 0) { _currentnode._innerlength = _currentnode._outerlength; _currentnode._innerstartindex = _currentnode._outerstartindex; if (_lastparentnode != null) { _lastparentnode.AppendChild(_currentnode); } } } else if (_currentnode._starttag && _lastparentnode != _currentnode) { if (_lastparentnode != null) { _lastparentnode.AppendChild(_currentnode); } ReadDocumentEncoding(_currentnode); HtmlNode dictionaryValueOrDefault = Utilities.GetDictionaryValueOrDefault(Lastnodes, _currentnode.Name); _currentnode._prevwithsamename = dictionaryValueOrDefault; Lastnodes[_currentnode.Name] = _currentnode; if (_currentnode.NodeType == HtmlNodeType.Document || _currentnode.NodeType == HtmlNodeType.Element) { _lastparentnode = _currentnode; } if (HtmlNode.IsCDataElement(CurrentNodeName())) { _state = ParseState.PcData; return true; } if (HtmlNode.IsClosedElement(_currentnode.Name) || HtmlNode.IsEmptyElement(_currentnode.Name)) { close = true; } } if (close || !_currentnode._starttag) { if (OptionStopperNodeName != null && _remainder == null && string.Compare(_currentnode.Name, OptionStopperNodeName, StringComparison.OrdinalIgnoreCase) == 0) { _remainderOffset = index; _remainder = Text.Substring(_remainderOffset); CloseCurrentNode(); return false; } CloseCurrentNode(); } return true; } private void PushNodeNameEnd(int index) { _currentnode._namelength = index - _currentnode._namestartindex; if (OptionFixNestedTags) { FixNestedTags(); } } private void PushNodeNameStart(bool starttag, int index) { _currentnode._starttag = starttag; _currentnode._namestartindex = index; } private void PushNodeStart(HtmlNodeType type, int index, int lineposition) { _currentnode = CreateNode(type, index); _currentnode._line = _line; _currentnode._lineposition = lineposition; _currentnode._streamposition = index; } private void ReadDocumentEncoding(HtmlNode node) { if (!OptionReadEncoding || node._namelength != 4 || node.Name != "meta") { return; } string text = null; HtmlAttribute htmlAttribute = node.Attributes["http-equiv"]; if (htmlAttribute != null) { if (string.Compare(htmlAttribute.Value, "content-type", StringComparison.OrdinalIgnoreCase) != 0) { return; } HtmlAttribute htmlAttribute2 = node.Attributes["content"]; if (htmlAttribute2 != null) { text = NameValuePairList.GetNameValuePairsValue(htmlAttribute2.Value, "charset"); } } else { htmlAttribute = node.Attributes["charset"]; if (htmlAttribute != null) { text = htmlAttribute.Value; } } if (!string.IsNullOrEmpty(text)) { if (string.Equals(text, "utf8", StringComparison.OrdinalIgnoreCase)) { text = "utf-8"; } try { _declaredencoding = Encoding.GetEncoding(text); } catch (ArgumentException) { _declaredencoding = null; } if (_onlyDetectEncoding) { throw new EncodingFoundException(_declaredencoding); } if (_streamencoding != null && _declaredencoding != null && _declaredencoding.CodePage != _streamencoding.CodePage) { AddError(HtmlParseErrorCode.CharsetMismatch, _line, _lineposition, _index, node.OuterHtml, "Encoding mismatch between StreamEncoding: " + _streamencoding.WebName + " and DeclaredEncoding: " + _declaredencoding.WebName); } } } public void DetectEncodingAndLoad(string path) { DetectEncodingAndLoad(path, detectEncoding: true); } public void DetectEncodingAndLoad(string path, bool detectEncoding) { if (path == null) { throw new ArgumentNullException("path"); } Encoding encoding = ((!detectEncoding) ? null : DetectEncoding(path)); if (encoding == null) { Load(path); } else { Load(path, encoding); } } public Encoding DetectEncoding(string path) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, OptionDefaultStreamEncoding); return DetectEncoding(reader); } public void Load(string path) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, OptionDefaultStreamEncoding); Load(reader); } public void Load(string path, bool detectEncodingFromByteOrderMarks) { if (path == null) { throw new ArgumentNullException("path"); } using StreamReader reader = new StreamReader(path, detectEncodingFromByteOrderMarks); Load(reader); } public void Load(string path, Encoding encoding) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding); Load(reader); } public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks); Load(reader); } public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize) { if (path == null) { throw new ArgumentNullException("path"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamReader reader = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize); Load(reader); } public void Save(string filename) { using StreamWriter writer = new StreamWriter(filename, append: false, GetOutEncoding()); Save(writer); } public void Save(string filename, Encoding encoding) { if (filename == null) { throw new ArgumentNullException("filename"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using StreamWriter writer = new StreamWriter(filename, append: false, encoding); Save(writer); } public XPathNavigator CreateNavigator() { return new HtmlNodeNavigator(this, _documentnode); } } [Flags] public enum HtmlElementFlag { CData = 1, Empty = 2, Closed = 4, CanOverlap = 8 } public class HtmlEntity { private enum ParseState { Text, EntityStart } private static readonly int _maxEntitySize; private static Dictionary<int, string> _entityName; private static Dictionary<string, int> _entityValue; public static bool UseWebUtility { get; set; } public static Dictionary<int, string> EntityName => _entityName; public static Dictionary<string, int> EntityValue => _entityValue; static HtmlEntity() { _entityName = new Dictionary<int, string>(); _entityValue = new Dictionary<string, int>(); _entityValue.Add("quot", 34); _entityName.Add(34, "quot"); _entityValue.Add("amp", 38); _entityName.Add(38, "amp"); _entityValue.Add("apos", 39); _entityName.Add(39, "apos"); _entityValue.Add("lt", 60); _entityName.Add(60, "lt"); _entityValue.Add("gt", 62); _entityName.Add(62, "gt"); _entityValue.Add("nbsp", 160); _entityName.Add(160, "nbsp"); _entityValue.Add("iexcl", 161); _entityName.Add(161, "iexcl"); _entityValue.Add("cent", 162); _entityName.Add(162, "cent"); _entityValue.Add("pound", 163); _entityName.Add(163, "pound"); _entityValue.Add("curren", 164); _entityName.Add(164, "curren"); _entityValue.Add("yen", 165); _entityName.Add(165, "yen"); _entityValue.Add("brvbar", 166); _entityName.Add(166, "brvbar"); _entityValue.Add("sect", 167); _entityName.Add(167, "sect"); _entityValue.Add("uml", 168); _entityName.Add(168, "uml"); _entityValue.Add("copy", 169); _entityName.Add(169, "copy"); _entityValue.Add("ordf", 170); _entityName.Add(170, "ordf"); _entityValue.Add("laquo", 171); _entityName.Add(171, "laquo"); _entityValue.Add("not", 172); _entityName.Add(172, "not"); _entityValue.Add("shy", 173); _entityName.Add(173, "shy"); _entityValue.Add("reg", 174); _entityName.Add(174, "reg"); _entityValue.Add("macr", 175); _entityName.Add(175, "macr"); _entityValue.Add("deg", 176); _entityName.Add(176, "deg"); _entityValue.Add("plusmn", 177); _entityName.Add(177, "plusmn"); _entityValue.Add("sup2", 178); _entityName.Add(178, "sup2"); _entityValue.Add("sup3", 179); _entityName.Add(179, "sup3"); _entityValue.Add("acute", 180); _entityName.Add(180, "acute"); _entityValue.Add("micro", 181); _entityName.Add(181, "micro"); _entityValue.Add("para", 182); _entityName.Add(182, "para"); _entityValue.Add("middot", 183); _entityName.Add(183, "middot"); _entityValue.Add("cedil", 184); _entityName.Add(184, "cedil"); _entityValue.Add("sup1", 185); _entityName.Add(185, "sup1"); _entityValue.Add("ordm", 186); _entityName.Add(186, "ordm"); _entityValue.Add("raquo", 187); _entityName.Add(187, "raquo"); _entityValue.Add("frac14", 188); _entityName.Add(188, "frac14"); _entityValue.Add("frac12", 189); _entityName.Add(189, "frac12"); _entityValue.Add("frac34", 190); _entityName.Add(190, "frac34"); _entityValue.Add("iquest", 191); _entityName.Add(191, "iquest"); _entityValue.Add("Agrave", 192); _entityName.Add(192, "Agrave"); _entityValue.Add("Aacute", 193); _entityName.Add(193, "Aacute"); _entityValue.Add("Acirc", 194); _entityName.Add(194, "Acirc"); _entityValue.Add("Atilde", 195); _entityName.Add(195, "Atilde"); _entityValue.Add("Auml", 196); _entityName.Add(196, "Auml"); _entityValue.Add("Aring", 197); _entityName.Add(197, "Aring"); _entityValue.Add("AElig", 198); _entityName.Add(198, "AElig"); _entityValue.Add("Ccedil", 199); _entityName.Add(199, "Ccedil"); _entityValue.Add("Egrave", 200); _entityName.Add(200, "Egrave"); _entityValue.Add("Eacute", 201); _entityName.Add(201, "Eacute"); _entityValue.Add("Ecirc", 202); _entityName.Add(202, "Ecirc"); _entityValue.Add("Euml", 203); _entityName.Add(203, "Euml"); _entityValue.Add("Igrave", 204); _entityName.Add(204, "Igrave"); _entityValue.Add("Iacute", 205); _entityName.Add(205, "Iacute"); _entityValue.Add("Icirc", 206); _entityName.Add(206, "Icirc"); _entityValue.Add("Iuml", 207); _entityName.Add(207, "Iuml"); _entityValue.Add("ETH", 208); _entityName.Add(208, "ETH"); _entityValue.Add("Ntilde", 209); _entityName.Add(209, "Ntilde"); _entityValue.Add("Ograve", 210); _entityName.Add(210, "Ograve"); _entityValue.Add("Oacute", 211); _entityName.Add(211, "Oacute"); _entityValue.Add("Ocirc", 212); _entityName.Add(212, "Ocirc"); _entityValue.Add("Otilde", 213); _entityName.Add(213, "Otilde"); _entityValue.Add("Ouml", 214); _entityName.Add(214, "Ouml"); _entityValue.Add("times", 215); _entityName.Add(215, "times"); _entityValue.Add("Oslash", 216); _entityName.Add(216, "Oslash"); _entityValue.Add("Ugrave", 217); _entityName.Add(217, "Ugrave"); _entityValue.Add("Uacute", 218); _entityName.Add(218, "Uacute"); _entityValue.Add("Ucirc", 219); _entityName.Add(219, "Ucirc"); _entityValue.Add("Uuml", 220); _entityName.Add(220, "Uuml"); _entityValue.Add("Yacute", 221); _entityName.Add(221, "Yacute"); _entityValue.Add("THORN", 222); _entityName.Add(222, "THORN"); _entityValue.Add("szlig", 223); _entityName.Add(223, "szlig"); _entityValue.Add("agrave", 224); _entityName.Add(224, "agrave"); _entityValue.Add("aacute", 225); _entityName.Add(225, "aacute"); _entityValue.Add("acirc", 226); _entityName.Add(226, "acirc"); _entityValue.Add("atilde", 227); _entityName.Add(227, "atilde"); _entityValue.Add("auml", 228); _entityName.Add(228, "auml"); _entityValue.Add("aring", 229); _entityName.Add(229, "aring"); _entityValue.Add("aelig", 230); _entityName.Add(230, "aelig"); _entityValue.Add("ccedil", 231); _entityName.Add(231, "ccedil"); _entityValue.Add("egrave", 232); _entityName.Add(232, "egrave"); _entityValue.Add("eacute", 233); _entityName.Add(233, "eacute"); _entityValue.Add("ecirc", 234); _entityName.Add(234, "ecirc"); _entityValue.Add("euml", 235); _entityName.Add(235, "euml"); _entityValue.Add("igrave", 236); _entityName.Add(236, "igrave"); _entityValue.Add("iacute", 237); _entityName.Add(237, "iacute"); _entityValue.Add("icirc", 238); _entityName.Add(238, "icirc"); _entityValue.Add("iuml", 239); _entityName.Add(239, "iuml"); _entityValue.Add("eth", 240); _entityName.Add(240, "eth"); _entityValue.Add("ntilde", 241); _entityName.Add(241, "ntilde"); _entityValue.Add("ograve", 242); _entityName.Add(242, "ograve"); _entityValue.Add("oacute", 243); _entityName.Add(243, "oacute"); _entityValue.Add("ocirc", 244); _entityName.Add(244, "ocirc"); _entityValue.Add("otilde", 245); _entityName.Add(245, "otilde"); _entityValue.Add("ouml", 246); _entityName.Add(246, "ouml"); _entityValue.Add("divide", 247); _entityName.Add(247, "divide"); _entityValue.Add("oslash", 248); _entityName.Add(248, "oslash"); _entityValue.Add("ugrave", 249); _entityName.Add(249, "ugrave"); _entityValue.Add("uacute", 250); _entityName.Add(250, "uacute"); _entityValue.Add("ucirc", 251); _entityName.Add(251, "ucirc"); _entityValue.Add("uuml", 252); _entityName.Add(252, "uuml"); _entityValue.Add("yacute", 253); _entityName.Add(253, "yacute"); _entityValue.Add("thorn", 254); _entityName.Add(254, "thorn"); _entityValue.Add("yuml", 255); _entityName.Add(255, "yuml"); _entityValue.Add("fnof", 402); _entityName.Add(402, "fnof"); _entityValue.Add("Alpha", 913); _entityName.Add(913, "Alpha"); _entityValue.Add("Beta", 914); _entityName.Add(914, "Beta"); _entityValue.Add("Gamma", 915); _entityName.Add(915, "Gamma"); _entityValue.Add("Delta", 916); _entityName.Add(916, "Delta"); _entityValue.Add("Epsilon", 917); _entityName.Add(917, "Epsilon"); _entityValue.Add("Zeta", 918); _entityName.Add(918, "Zeta"); _entityValue.Add("Eta", 919); _entityName.Add(919, "Eta"); _entityValue.Add("Theta", 920); _entityName.Add(920, "Theta"); _entityValue.Add("Iota", 921); _entityName.Add(921, "Iota"); _entityValue.Add("Kappa", 922); _entityName.Add(922, "Kappa"); _entityValue.Add("Lambda", 923); _entityName.Add(923, "Lambda"); _entityValue.Add("Mu", 924); _entityName.Add(924, "Mu"); _entityValue.Add("Nu", 925); _entityName.Add(925, "Nu"); _entityValue.Add("Xi", 926); _entityName.Add(926, "Xi"); _entityValue.Add("Omicron", 927); _entityName.Add(927, "Omicron"); _entityValue.Add("Pi", 928); _entityName.Add(928, "Pi"); _entityValue.Add("Rho", 929); _entityName.Add(929, "Rho"); _entityValue.Add("Sigma", 931); _entityName.Add(931, "Sigma"); _entityValue.Add("Tau", 932); _entityName.Add(932, "Tau"); _entityValue.Add("Upsilon", 933); _entityName.Add(933, "Upsilon"); _entityValue.Add("Phi", 934); _entityName.Add(934, "Phi"); _entityValue.Add("Chi", 935); _entityName.Add(935, "Chi"); _entityValue.Add("Psi", 936); _entityName.Add(936, "Psi"); _entityValue.Add("Omega", 937); _entityName.Add(937, "Omega"); _entityValue.Add("alpha", 945); _entityName.Add(945, "alpha"); _entityValue.Add("beta", 946); _entityName.Add(946, "beta"); _entityValue.Add("gamma", 947); _entityName.Add(947, "gamma"); _entityValue.Add("delta", 948); _entityName.Add(948, "delta"); _entityValue.Add("epsilon", 949); _entityName.Add(949, "epsilon"); _entityValue.Add("zeta", 950); _entityName.Add(950, "zeta"); _entityValue.Add("eta", 951); _entityName.Add(951, "eta"); _entityValue.Add("theta", 952); _entityName.Add(952, "theta"); _entityValue.Add("iota", 953); _entityName.Add(953, "iota"); _entityValue.Add("kappa", 954); _entityName.Add(954, "kappa"); _entityValue.Add("lambda", 955); _entityName.Add(955, "lambda"); _entityValue.Add("mu", 956); _entityName.Add(956, "mu"); _entityValue.Add("nu", 957); _entityName.Add(957, "nu"); _entityValue.Add("xi", 958); _entityName.Add(958, "xi"); _entityValue.Add("omicron", 959); _entityName.Add(959, "omicron"); _entityValue.Add("pi", 960); _entityName.Add(960, "pi"); _entityValue.Add("rho", 961); _entityName.Add(961, "rho"); _entityValue.Add("sigmaf", 962); _entityName.Add(962, "sigmaf"); _entityValue.Add("sigma", 963); _entityName.Add(963, "sigma"); _entityValue.Add("tau", 964); _entityName.Add(964, "tau"); _entityValue.Add("upsilon", 965); _entityName.Add(965, "upsilon"); _entityValue.Add("phi", 966); _entityName.Add(966, "phi"); _entityValue.Add("chi", 967); _entityName.Add(967, "chi"); _entityValue.Add("psi", 968); _entityName.Add(968, "psi"); _entityValue.Add("omega", 969); _entityName.Add(969, "omega"); _entityValue.Add("thetasym", 977); _entityName.Add(977, "thetasym"); _entityValue.Add("upsih", 978); _entityName.Add(978, "upsih"); _entityValue.Add("piv", 982); _entityName.Add(982, "piv"); _entityValue.Add("bull", 8226); _entityName.Add(8226, "bull"); _entityValue.Add("hellip", 8230); _entityName.Add(8230, "hellip"); _entityValue.Add("prime", 8242); _entityName.Add(8242, "prime"); _entityValue.Add("Prime", 8243); _entityName.Add(8243, "Prime"); _entityValue.Add("oline", 8254); _entityName.Add(8254, "oline"); _entityValue.Add("frasl", 8260); _entityName.Add(8260, "frasl"); _entityValue.Add("weierp", 8472); _entityName.Add(8472, "weierp"); _entityValue.Add("image", 8465); _entityName.Add(8465, "image"); _entityValue.Add("real", 8476); _entityName.Add(8476, "real"); _entityValue.Add("trade", 8482); _entityName.Add(8482, "trade"); _entityValue.Add("alefsym", 8501); _entityName.Add(8501, "alefsym"); _entityValue.Add("larr", 8592); _entityName.Add(8592, "larr"); _entityValue.Add("uarr", 8593); _entityName.Add(8593, "uarr"); _entityValue.Add("rarr", 8594); _entityName.Add(8594, "rarr"); _entityValue.Add("darr", 8595); _entityName.Add(8595, "darr"); _entityValue.Add("harr", 8596); _entityName.Add(8596, "harr"); _entityValue.Add("crarr", 8629); _entityName.Add(8629, "crarr"); _entityValue.Add("lArr", 8656); _entityName.Add(8656, "lArr"); _entityValue.Add("uArr", 8657); _entityName.Add(8657, "uArr"); _entityValue.Add("rArr", 8658); _entityName.Add(8658, "rArr"); _entityValue.Add("dArr", 8659); _entityName.Add(8659, "dArr"); _entityValue.Add("hArr", 8660); _entityName.Add(8660, "hArr"); _entityValue.Add("forall", 8704); _entityName.Add(8704, "forall"); _entityValue.Add("part", 8706); _entityName.Add(8706, "part"); _entityValue.Add("exist", 8707); _entityName.Add(8707, "exist"); _entityValue.Add("empty", 8709); _entityName.Add(8709, "empty"); _entityValue.Add("nabla", 8711); _entityName.Add(8711, "nabla"); _entityValue.Add("isin", 8712); _entityName.Add(8712, "isin"); _entityValue.Add("notin", 8713); _entityName.Add(8713, "notin"); _entityValue.Add("ni", 8715); _entityName.Add(8715, "ni"); _entityValue.Add("prod", 8719); _entityName.Add(8719, "prod"); _entityValue.Add("sum", 8721); _entityName.Add(8721, "sum"); _entityValue.Add("minus", 8722); _entityName.Add(8722, "minus"); _entityValue.Add("lowast", 8727); _entityName.Add(8727, "lowast"); _entityValue.Add("radic", 8730); _entityName.Add(8730, "radic"); _entityValue.Add("prop", 8733); _entityName.Add(8733, "prop"); _entityValue.Add("infin", 8734); _entityName.Add(8734, "infin"); _entityValue.Add("ang", 8736); _entityName.Add(8736, "ang"); _entityValue.Add("and", 8743); _entityName.Add(8743, "and"); _entityValue.Add("or", 8744); _entityName.Add(8744, "or"); _entityValue.Add("cap", 8745); _entityName.Add(8745, "cap"); _entityValue.Add("cup", 8746); _entityName.Add(8746, "cup"); _entityValue.Add("int", 8747); _entityName.Add(8747, "int"); _entityValue.Add("there4", 8756); _entityName.Add(8756, "there4"); _entityValue.Add("sim", 8764); _entityName.Add(8764, "sim"); _entityValue.Add("cong", 8773); _entityName.Add(8773, "cong"); _entityValue.Add("asymp", 8776); _entityName.Add(8776, "asymp"); _entityValue.Add("ne", 8800); _entityName.Add(8800, "ne"); _entityValue.Add("equiv", 8801); _entityName.Add(8801, "equiv"); _entityValue.Add("le", 8804); _entityName.Add(8804, "le"); _entityValue.Add("ge", 8805); _entityName.Add(8805, "ge"); _entityValue.Add("sub", 8834); _entityName.Add(8834, "sub"); _entityValue.Add("sup", 8835); _entityName.Add(8835, "sup"); _entityValue.Add("nsub", 8836); _entityName.Add(8836, "nsub"); _entityValue.Add("sube", 8838); _entityName.Add(8838, "sube"); _entityValue.Add("supe", 8839); _entityName.Add(8839, "supe"); _entityValue.Add("oplus", 8853); _entityName.Add(8853, "oplus"); _entityValue.Add("otimes", 8855); _entityName.Add(8855, "otimes"); _entityValue.Add("perp", 8869); _entityName.Add(8869, "perp"); _entityValue.Add("sdot", 8901); _entityName.Add(8901, "sdot"); _entityValue.Add("lceil", 8968); _entityName.Add(8968, "lceil"); _entityValue.Add("rceil", 8969); _entityName.Add(8969, "rceil"); _entityValue.Add("lfloor", 8970); _entityName.Add(8970, "lfloor"); _entityValue.Add("rfloor", 8971); _entityName.Add(8971, "rfloor"); _entityValue.Add("lang", 9001); _entityName.Add(9001, "lang"); _entityValue.Add("rang", 9002); _entityName.Add(9002, "rang"); _entityValue.Add("loz", 9674); _entityName.Add(9674, "loz"); _entityValue.Add("spades", 9824); _entityName.Add(9824, "spades"); _entityValue.Add("clubs", 9827); _entityName.Add(9827, "clubs"); _entityValue.Add("hearts", 9829); _entityName.Add(9829, "hearts"); _entityValue.Add("diams", 9830); _entityName.Add(9830, "diams"); _entityValue.Add("OElig", 338); _entityName.Add(338, "OElig"); _entityValue.Add("oelig", 339); _entityName.Add(339, "oelig"); _entityValue.Add("Scaron", 352); _entityName.Add(352, "Scaron"); _entityValue.Add("scaron", 353); _entityName.Add(353, "scaron"); _entityValue.Add("Yuml", 376); _entityName.Add(376, "Yuml"); _entityValue.Add("circ", 710); _entityName.Add(710, "circ"); _entityValue.Add("tilde", 732); _entityName.Add(732, "tilde"); _entityValue.Add("ensp", 8194); _entityName.Add(8194, "ensp"); _entityValue.Add("emsp", 8195); _entityName.Add(8195, "emsp"); _entityValue.Add("thinsp", 8201); _entityName.Add(8201, "thinsp"); _entityValue.Add("zwnj", 8204); _entityName.Add(8204, "zwnj"); _entityValue.Add("zwj", 8205); _entityName.Add(8205, "zwj"); _entityValue.Add("lrm", 8206); _entityName.Add(8206, "lrm"); _entityValue.Add("rlm", 8207); _entityName.Add(8207, "rlm"); _entityValue.Add("ndash", 8211); _entityName.Add(8211, "ndash"); _entityValue.Add("mdash", 8212); _entityName.Add(8212, "mdash"); _entityValue.Add("lsquo", 8216); _entityName.Add(8216, "lsquo"); _entityValue.Add("rsquo", 8217); _entityName.Add(8217, "rsquo"); _entityValue.Add("sbquo", 8218); _entityName.Add(8218, "sbquo"); _entityValue.Add("ldquo", 8220); _entityName.Add(8220, "ldquo"); _entityValue.Add("rdquo", 8221); _entityName.Add(8221, "rdquo"); _entityValue.Add("bdquo", 8222); _entityName.Add(8222, "bdquo"); _entityValue.Add("dagger", 8224); _entityName.Add(8224, "dagger"); _entityValue.Add("Dagger", 8225); _entityName.Add(8225, "Dagger"); _entityValue.Add("permil", 8240); _entityName.Add(8240, "permil"); _entityValue.Add("lsaquo", 8249); _entityName.Add(8249, "lsaquo"); _entityValue.Add("rsaquo", 8250); _entityName.Add(8250, "rsaquo"); _entityValue.Add("euro", 8364); _entityName.Add(8364, "euro"); _maxEntitySize = 9; } private HtmlEntity() { } public static string DeEntitize(string text) { if (text == null) { return null; } if (text.Length == 0) { return text; } StringBuilder stringBuilder = new StringBuilder(text.Length); ParseState parseState = ParseState.Text; StringBuilder stringBuilder2 = new StringBuilder(10); for (int i = 0; i < text.Length; i++) { switch (parseState) { case ParseState.Text: if (text[i] == '&') { parseState = ParseState.EntityStart; } else { stringBuilder.Append(text[i]); } break; case ParseState.EntityStart: switch (text[i]) { case ';': if (stringBuilder2.Length == 0) { stringBuilder.Append("&;"); } else { int value2; if (stringBuilder2[0] == '#') { string text2 = stringBuilder2.ToString(); try { string text3 = text2.Substring(1).Trim(); int fromBase; if (text3.StartsWith("x", StringComparison.OrdinalIgnoreCase)) { fromBase = 16; text3 = text3.Substring(1); } else { fromBase = 10; } int value = Convert.ToInt32(text3, fromBase); stringBuilder.Append(Convert.ToChar(value)); } catch { stringBuilder.Append("&#" + text2 + ";"); } } else if (!_entityValue.TryGetValue(stringBuilder2.ToString(), out value2)) { stringBuilder.Append("&" + stringBuilder2?.ToString() + ";"); } else { stringBuilder.Append(Convert.ToChar(value2)); } stringBuilder2.Remove(0, stringBuilder2.Length); } parseState = ParseState.Text; break; case '&': stringBuilder.Append("&" + stringBuilder2); stringBuilder2.Remove(0, stringBuilder2.Length); break; default: stringBuilder2.Append(text[i]); if (stringBuilder2.Length > _maxEntitySize) { parseState = ParseState.Text; stringBuilder.Append("&" + stringBuilder2); stringBuilder2.Remove(0, stringBuilder2.Length); } break; } break; } } if (parseState == ParseState.EntityStart) { stringBuilder.Append("&" + stringBuilder2); } return stringBuilder.ToString(); } public static HtmlNode Entitize(HtmlNode node) { if (node == null) { throw new ArgumentNullException("node"); } HtmlNode htmlNode = node.CloneNode(deep: true); if (htmlNode.HasAttributes) { Entitize(htmlNode.Attributes); } if (htmlNode.HasChildNodes) { Entitize(htmlNode.ChildNodes); } else if (htmlNode.NodeType == HtmlNodeType.Text) { ((HtmlTextNode)htmlNode).Text = Entitize(((HtmlTextNode)htmlNode).Text, useNames: true, entitizeQuotAmpAndLtGt: true); } return htmlNode; } public static string Entitize(string text) { return Entitize(text, useNames: true); } public static string Entitize(string text, bool useNames) { return Entitize(text, useNames, entitizeQuotAmpAndLtGt: false); } public static string Entitize(string text, bool useNames, bool entitizeQuotAmpAndLtGt) { if (text == null) { return null; } if (text.Length == 0) { return text; } StringBuilder stringBuilder = new StringBuilder(text.Length); if (UseWebUtility) { TextElementEnumerator textElementEnumerator = StringInfo.GetTextElementEnumerator(text); while (textElementEnumerator.MoveNext()) { stringBuilder.Append(WebUtility.HtmlEncode(textElementEnumerator.GetTextElement())); } } else { for (int i = 0; i < text.Length; i++) { int num = text[i]; if (num > 127 || (entitizeQuotAmpAndLtGt && (num == 34 || num == 38 || num == 60 || num == 62))) { string value = null; if (useNames) { EntityName.TryGetValue(num, out value); } if (value == null) { stringBuilder.Append("&#" + num + ";"); } else { stringBuilder.Append("&" + value + ";"); } } else { stringBuilder.Append(text[i]); } } } return stringBuilder.ToString(); } private static void Entitize(HtmlAttributeCollection collection) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)collection) { if (item.Value != null) { item.Value = Entitize(item.Value); } } } private static void Entitize(HtmlNodeCollection collection) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)collection) { if (item.HasAttributes) { Entitize(item.Attributes); } if (item.HasChildNodes) { Entitize(item.ChildNodes); } else if (item.NodeType == HtmlNodeType.Text) { ((HtmlTextNode)item).Text = Entitize(((HtmlTextNode)item).Text, useNames: true, entitizeQuotAmpAndLtGt: true); } } } } internal class HtmlNameTable : XmlNameTable { private NameTable _nametable = new NameTable(); public override string Add(string array) { return _nametable.Add(array); } public override string Add(char[] array, int offset, int length) { return _nametable.Add(array, offset, length); } public override string Get(string array) { return _nametable.Get(array); } public override string Get(char[] array, int offset, int length) { return _nametable.Get(array, offset, length); } internal string GetOrAdd(string array) { string text = Get(array); if (text == null) { return Add(array); } return text; } } [DebuggerDisplay("Name: {OriginalName}")] public class HtmlNode : IXPathNavigable { internal const string DepthLevelExceptionMessage = "The document is too complex to parse"; internal HtmlAttributeCollection _attributes; internal HtmlNodeCollection _childnodes; internal HtmlNode _endnode; private bool _changed; internal string _innerhtml; internal int _innerlength; internal int _innerstartindex; internal int _line; internal int _lineposition; private string _name; internal int _namelength; internal int _namestartindex; internal HtmlNode _nextnode; internal HtmlNodeType _nodetype; internal string _outerhtml; internal int _outerlength; internal int _outerstartindex; private string _optimizedName; internal HtmlDocument _ownerdocument; internal HtmlNode _parentnode; internal HtmlNode _prevnode; internal HtmlNode _prevwithsamename; internal bool _starttag; internal int _streamposition; internal bool _isImplicitEnd; internal bool _isHideInnerText; public static readonly string HtmlNodeTypeNameComment; public static readonly string HtmlNodeTypeNameDocument; public static readonly string HtmlNodeTypeNameText; public static Dictionary<string, HtmlElementFlag> ElementsFlags; public HtmlAttributeCollection Attributes { get { if (!HasAttributes) { _attributes = new HtmlAttributeCollection(this); } return _attributes; } internal set { _attributes = value; } } public HtmlNodeCollection ChildNodes { get { return _childnodes ?? (_childnodes = new HtmlNodeCollection(this)); } internal set { _childnodes = value; } } public bool Closed => _endnode != null; public HtmlAttributeCollection ClosingAttributes { get { if (HasClosingAttributes) { return _endnode.Attributes; } return new HtmlAttributeCollection(this); } } public HtmlNode EndNode => _endnode; public HtmlNode FirstChild { get { if (HasChildNodes) { return _childnodes[0]; } return null; } } public bool HasAttributes { get { if (_attributes == null) { return false; } if (_attributes.Count <= 0) { return false; } return true; } } public bool HasChildNodes { get { if (_childnodes == null) { return false; } if (_childnodes.Count <= 0) { return false; } return true; } } public bool HasClosingAttributes { get { if (_endnode == null || _endnode == this) { return false; } if (_endnode._attributes == null) { return false; } if (_endnode._attributes.Count <= 0) { return false; } return true; } } public string Id { get { if (_ownerdocument.Nodesid == null) { throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse); } return GetId(); } set { if (_ownerdocument.Nodesid == null) { throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse); } if (value == null) { throw new ArgumentNullException("value"); } SetId(value); } } public virtual string InnerHtml { get { if (_changed) { UpdateHtml(); return _innerhtml; } if (_innerhtml != null) { return _innerhtml; } if (_innerstartindex < 0 || _innerlength < 0) { return string.Empty; } return _ownerdocument.Text.Substring(_innerstartindex, _innerlength); } set { HtmlDocument htmlDocument = new HtmlDocument(); htmlDocument.LoadHtml(value); RemoveAllChildren(); AppendChildren(htmlDocument.DocumentNode.ChildNodes); } } public virtual string InnerText { get { StringBuilder stringBuilder = new StringBuilder(); int depthLevel = 0; string name = Name; if (name != null) { name = name.ToLowerInvariant(); bool isDisplayScriptingText = name == "head" || name == "script" || name == "style"; InternalInnerText(stringBuilder, isDisplayScriptingText, depthLevel); } else { InternalInnerText(stringBuilder, isDisplayScriptingText: false, depthLevel); } return stringBuilder.ToString(); } } public HtmlNode LastChild { get { if (HasChildNodes) { return _childnodes[_childnodes.Count - 1]; } return null; } } public int Line { get { return _line; } internal set { _line = value; } } public int LinePosition { get { return _lineposition; } internal set { _lineposition = value; } } public int InnerStartIndex => _innerstartindex; public int OuterStartIndex => _outerstartindex; public int InnerLength => InnerHtml.Length; public int OuterLength => OuterHtml.Length; public string Name { get { if (_optimizedName == null) { if (_name == null) { SetName(_ownerdocument.Text.Substring(_namestartindex, _namelength)); } if (_name == null) { _optimizedName = string.Empty; } else if (OwnerDocument != null) { _optimizedName = (OwnerDocument.OptionDefaultUseOriginalName ? _name : _name.ToLowerInvariant()); } else { _optimizedName = _name.ToLowerInvariant(); } } return _optimizedName; } set { SetName(value); SetChanged(); } } public HtmlNode NextSibling { get { return _nextnode; } internal set { _nextnode = value; } } public HtmlNodeType NodeType { get { return _nodetype; } internal set { _nodetype = value; } } public string OriginalName => _name; public virtual string OuterHtml { get { if (_changed) { UpdateHtml(); return _outerhtml; } if (_outerhtml != null) { return _outerhtml; } if (_outerstartindex < 0 || _outerlength < 0) { return string.Empty; } return _ownerdocument.Text.Substring(_outerstartindex, _outerlength); } } public HtmlDocument OwnerDocument { get { return _ownerdocument; } internal set { _ownerdocument = value; } } public HtmlNode ParentNode { get { return _parentnode; } internal set { _parentnode = value; } } public HtmlNode PreviousSibling { get { return _prevnode; } internal set { _prevnode = value; } } public int StreamPosition => _streamposition; public string XPath => ((ParentNode == null || ParentNode.NodeType == HtmlNodeType.Document) ? "/" : (ParentNode.XPath + "/")) + GetRelativeXpath(); public int Depth { get; set; } static HtmlNode() { HtmlNodeTypeNameComment = "#comment"; HtmlNodeTypeNameDocument = "#document"; HtmlNodeTypeNameText = "#text"; ElementsFlags = new Dictionary<string, HtmlElementFlag>(StringComparer.OrdinalIgnoreCase); ElementsFlags.Add("script", HtmlElementFlag.CData); ElementsFlags.Add("style", HtmlElementFlag.CData); ElementsFlags.Add("noxhtml", HtmlElementFlag.CData); ElementsFlags.Add("textarea", HtmlElementFlag.CData); ElementsFlags.Add("title", HtmlElementFlag.CData); ElementsFlags.Add("base", HtmlElementFlag.Empty); ElementsFlags.Add("link", HtmlElementFlag.Empty); ElementsFlags.Add("meta", HtmlElementFlag.Empty); ElementsFlags.Add("isindex", HtmlElementFlag.Empty); ElementsFlags.Add("hr", HtmlElementFlag.Empty); ElementsFlags.Add("col", HtmlElementFlag.Empty); ElementsFlags.Add("img", HtmlElementFlag.Empty); ElementsFlags.Add("param", HtmlElementFlag.Empty); ElementsFlags.Add("embed", HtmlElementFlag.Empty); ElementsFlags.Add("frame", HtmlElementFlag.Empty); ElementsFlags.Add("wbr", HtmlElementFlag.Empty); ElementsFlags.Add("bgsound", HtmlElementFlag.Empty); ElementsFlags.Add("spacer", HtmlElementFlag.Empty); ElementsFlags.Add("keygen", HtmlElementFlag.Empty); ElementsFlags.Add("area", HtmlElementFlag.Empty); ElementsFlags.Add("input", HtmlElementFlag.Empty); ElementsFlags.Add("basefont", HtmlElementFlag.Empty); ElementsFlags.Add("source", HtmlElementFlag.Empty); ElementsFlags.Add("form", HtmlElementFlag.CanOverlap); ElementsFlags.Add("br", HtmlElementFlag.Empty | HtmlElementFlag.Closed); if (!HtmlDocument.DisableBehaviorTagP) { ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed); } } public HtmlNode(HtmlNodeType type, HtmlDocument ownerdocument, int index) { _nodetype = type; _ownerdocument = ownerdocument; _outerstartindex = index; switch (type) { case HtmlNodeType.Comment: SetName(HtmlNodeTypeNameComment); _endnode = this; break; case HtmlNodeType.Document: SetName(HtmlNodeTypeNameDocument); _endnode = this; break; case HtmlNodeType.Text: SetName(HtmlNodeTypeNameText); _endnode = this; break; } if (_ownerdocument.Openednodes != null && !Closed && -1 != index) { _ownerdocument.Openednodes.Add(index, this); } if (-1 == index && type != HtmlNodeType.Comment && type != HtmlNodeType.Text) { SetChanged(); } } internal virtual void InternalInnerText(StringBuilder sb, bool isDisplayScriptingText, int depthLevel) { depthLevel++; if (depthLevel > HtmlDocument.MaxDepthLevel) { throw new Exception($"Maximum deep level reached: {HtmlDocument.MaxDepthLevel}"); } if (!_ownerdocument.BackwardCompatibility) { if (HasChildNodes) { AppendInnerText(sb, isDisplayScriptingText); } else { sb.Append(GetCurrentNodeText()); } } else if (_nodetype == HtmlNodeType.Text) { sb.Append(((HtmlTextNode)this).Text); } else { if (_nodetype == HtmlNodeType.Comment || !HasChildNodes || (_isHideInnerText && !isDisplayScriptingText)) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { item.InternalInnerText(sb, isDisplayScriptingText, depthLevel); } } } public virtual string GetDirectInnerText() { if (!_ownerdocument.BackwardCompatibility) { if (HasChildNodes) { StringBuilder stringBuilder = new StringBuilder(); AppendDirectInnerText(stringBuilder); return stringBuilder.ToString(); } return GetCurrentNodeText(); } if (_nodetype == HtmlNodeType.Text) { return ((HtmlTextNode)this).Text; } if (_nodetype == HtmlNodeType.Comment) { return ""; } if (!HasChildNodes) { return string.Empty; } StringBuilder stringBuilder2 = new StringBuilder(); foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { if (item._nodetype == HtmlNodeType.Text) { stringBuilder2.Append(((HtmlTextNode)item).Text); } } return stringBuilder2.ToString(); } internal string GetCurrentNodeText() { if (_nodetype == HtmlNodeType.Text) { string text = ((HtmlTextNode)this).Text; if (ParentNode.Name != "pre") { text = text.Replace("\n", "").Replace("\r", "").Replace("\t", ""); } return text; } return ""; } internal void AppendDirectInnerText(StringBuilder sb) { if (_nodetype == HtmlNodeType.Text) { sb.Append(GetCurrentNodeText()); } if (!HasChildNodes) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { sb.Append(item.GetCurrentNodeText()); } } internal void AppendInnerText(StringBuilder sb, bool isShowHideInnerText) { if (_nodetype == HtmlNodeType.Text) { sb.Append(GetCurrentNodeText()); } if (!HasChildNodes || (_isHideInnerText && !isShowHideInnerText)) { return; } foreach (HtmlNode item in (IEnumerable<HtmlNode>)ChildNodes) { item.AppendInnerText(sb, isShowHideInnerText); } } internal void SetName(string value) { _name = value; _optimizedName = null; } public static bool CanOverlapElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.CanOverlap) != 0; } public static HtmlNode CreateNode(string html) { return CreateNode(html, null); } public static HtmlNode CreateNode(string html, Action<HtmlDocument> htmlDocumentBuilder) { HtmlDocument htmlDocument = new HtmlDocument(); htmlDocumentBuilder?.Invoke(htmlDocument); htmlDocument.LoadHtml(html); if (!htmlDocument.DocumentNode.IsSingleElementNode()) { throw new Exception("Multiple node elements can't be created."); } for (HtmlNode htmlNode = htmlDocument.DocumentNode.FirstChild; htmlNode != null; htmlNode = htmlNode.NextSibling) { if (htmlNode.NodeType == HtmlNodeType.Element && htmlNode.OuterHtml != "\r\n") { return htmlNode; } } return htmlDocument.DocumentNode.FirstChild; } public static bool IsCDataElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.CData) != 0; } public static bool IsClosedElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.Closed) != 0; } public static bool IsEmptyElement(string name) { if (name == null) { throw new ArgumentNullException("name"); } if (name.Length == 0) { return true; } if ('!' == name[0]) { return true; } if ('?' == name[0]) { return true; } if (!ElementsFlags.TryGetValue(name, out var value)) { return false; } return (value & HtmlElementFlag.Empty) != 0; } public static bool IsOverlappedClosingElement(string text) { if (text == null) { throw new ArgumentNullException("text"); } if (text.Length <= 4) { return false; } if (text[0] != '<' || text[text.Length - 1] != '>' || text[1] != '/') { return false; } return CanOverlapElement(text.Substring(2, text.Length - 3)); } public IEnumerable<HtmlNode> Ancestors() { HtmlNode node = ParentNode; if (node != null) { yield return node; while (node.ParentNode != null) { yield return node.ParentNode; node = node.ParentNode; } } } public IEnumerable<HtmlNode> Ancestors(string name) { for (HtmlNode i = ParentNode; i != null; i = i.ParentNode) { if (i.Name == name) { yield return i; } } } public IEnumerable<HtmlNode> AncestorsAndSelf() { for (HtmlNode i = this; i != null; i = i.ParentNode) { yield return i; } } public IEnumerable<HtmlNode> AncestorsAndSelf(string name) { for (HtmlNode i = this; i != null; i = i.ParentNode) { if (i.Name == name) { yield return i; } } } public HtmlNode AppendChild(HtmlNode newChild) { if (newChild == null) { throw new ArgumentNullException("newChild"); } ChildNodes.Append(newChild); _ownerdocument.SetIdForNode(newChild, newChild.GetId()); SetChildNodesId(newChild); HtmlNode parentnode = _parentnode; HtmlDocument htmlDocument = null; while (parentnode != null) { if (parentnode.OwnerDocument != htmlDocument) { parentnode.OwnerDocument.SetIdForNode(newChild, newChild.GetId()); parentnode.SetChildNodesId(newChild); htmlDocument = parentnode.OwnerDocument; } parentnode = parentnode._parentnode; } SetChanged(); return newChild; } public void SetChildNodesId(HtmlNode chilNode) { foreach (HtmlNode item in (IEnumerable<HtmlNode>)chilNode.ChildNodes) { _ownerdocument.SetIdForNode(item, item.GetId()); if (item.ChildNodes == chilNode.ChildNodes) { throw new Exception("Oops! a scenario that will cause a Stack Overflow has been found. See the following issue for an example: https://github.com/zzzprojects/html-agility-pack/issues/513"); } SetChildNodesId(item); } } public void AppendChildren(HtmlNodeCollection newChildren) { if (newChildren == null) { throw new ArgumentNullException("newChildren"); } foreach (HtmlNode item in (IEnumerable<HtmlNode>)newChildren) { AppendChild(item); } } public IEnumerable<HtmlAttribute> ChildAttributes(string name) { return Attributes.AttributesWithName(name); } public HtmlNode Clone() { return CloneNode(deep: true); } public HtmlNode CloneNode(string newName) { return CloneNode(newName, deep: true); } public HtmlNode CloneNode(string newName, bool deep) { if (newName == null) { throw new ArgumentNullException("newName"); } HtmlNode htmlNode = CloneNode(deep); htmlNode.SetName(newName); return htmlNode; } public HtmlNode CloneNode(bool deep) { HtmlNode htmlNode = _ownerdocument.CreateNode(_nodetype); htmlNode.SetName(OriginalName); switch (_nodetype) { case HtmlNodeType.Comment: ((HtmlCommentNode)htmlNode).Comment = ((HtmlCommentNode)this).Comment; return htmlNode; case HtmlNodeType.Text: ((HtmlTextNode)htmlNode).Text = ((HtmlTextNode)this).Text; return htmlNode; default: if (HasAttributes) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)_attributes) { HtmlAttribute newAttribute = item.Clone(); htmlNode.Attributes.Append(newAttribute); } } if (HasClosingAttributes) { htmlNode._endnode = _endnode.CloneNode(deep: false); foreach (HtmlAttribute item2 in (IEnumerable<HtmlAttribute>)_endnode._attributes) { HtmlAttribute newAttribute2 = item2.Clone(); htmlNode._endnode._attributes.Append(newAttribute2); } } if (!deep) { return htmlNode; } if (!HasChildNodes) { return htmlNode; } { foreach (HtmlNode item3 in (IEnumerable<HtmlNode>)_childnodes) { HtmlNode newChild = item3.CloneNode(deep); htmlNode.AppendChild(newChild); } return htmlNode; } } } public void CopyFrom(HtmlNode node) { CopyFrom(node, deep: true); } public void CopyFrom(HtmlNode node, bool deep) { if (node == null) { throw new ArgumentNullException("node"); } Attributes.RemoveAll(); if (node.HasAttributes) { foreach (HtmlAttribute item in (IEnumerable<HtmlAttribute>)node.Attributes) { HtmlAttribute newAttribute = item.Clone(); Attributes.Append(newAttribute); } } if (!deep) { return; } RemoveAllChildren(); if (!node.HasChildNodes) { return; } foreach (HtmlNode item2 in (IEnumerable<HtmlNode>)node.ChildNodes) { AppendChild(item2.CloneNode(deep: true)); } } [Obsolete("Use Descendants() instead, the results of this function will change in a future version")] public IEnumerable<HtmlNode> DescendantNodes(int level = 0) { if (level > HtmlDocument.MaxDepthLevel) { throw new ArgumentException("The document is too complex to parse"); } foreach (HtmlNode node in (IEnumerable<HtmlNode>)ChildNodes) { yield return node; foreach (HtmlNode item in node.DescendantNode
Newtonsoft.Json.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("13.0.3.27908")] [assembly: AssemblyInformationalVersion("13.0.3+0a2e291c0d9c0c7675d445703e51750363a549ef")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET 4.5")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/JamesNK/Newtonsoft.Json")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyVersion("13.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, AllowMultiple = true)] internal sealed class NotNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public NotNullWhenAttribute(bool returnValue) { ReturnValue = returnValue; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, Inherited = false)] internal sealed class MaybeNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, Inherited = false)] internal sealed class AllowNullAttribute : Attribute { } [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] internal class DoesNotReturnIfAttribute : Attribute { public bool ParameterValue { get; } public DoesNotReturnIfAttribute(bool parameterValue) { ParameterValue = parameterValue; } } } namespace Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime, DateTimeOffset } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string? Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = Volatile.Read(ref _mask); int num4 = num & num3; for (Entry entry = _entries[num4]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; Volatile.Write(ref _mask, num); } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[]? array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type? _namingStrategyType; private object[]? _namingStrategyParameters; public string? Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[]? NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy? NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Func<JsonSerializerSettings>? DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } public static string ToString(DateTimeOffset value, DateFormatHandling format) { using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } private static string ToStringInternal(BigInteger value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (StringUtils.IndexOf(text, '.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri? value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string? value) { return ToString(value, '"'); } public static string ToString(string? value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object? value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] public static string SerializeObject(object? value) { return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, JsonSerializerSettings? settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] public static object? DeserializeObject(string value) { return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static object? DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } public static void PopulateObject(string value, object target, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } public static string SerializeXmlNode(XmlNode? node) { return SerializeXmlNode(node, Formatting.None); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XmlDocument? DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } public static string SerializeXNode(XObject? node) { return SerializeXNode(node, Formatting.None); } public static string SerializeXNode(XObject? node, Formatting formatting) { return SerializeXNode(node, formatting, omitRootObject: false); } public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XDocument? DeserializeXNode(string value) { return DeserializeXNode(value, null); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer); public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer); public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[]? ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception? innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string? Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal MissingMemberHandling? _missingMemberHandling; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling.GetValueOrDefault(); } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired.GetValueOrDefault(); } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string? PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!StringUtils.EndsWith(message, '.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get; set; } public object[]? NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public int Order { get { return _order.GetValueOrDefault(); } set { _order = value; } } public Required Required { get { return _required.GetValueOrDefault(); } set { _required = value; } } public string? PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object? _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo? _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string? _dateFormatString; private List<JsonPosition>? _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string? DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object? Value => _value; public virtual Type? ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync(); } public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (TokenType == JsonToken.PropertyName) { await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth) { } } } internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken) { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { throw CreateUnexpectedEndException(); } } public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean()); } public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes()); } internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken) { List<byte> buffer = new List<byte>(); do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(buffer)); byte[] array = buffer.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime()); } public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset()); } public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal()); } public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(ReadAsDouble()); } public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32()); } public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString()); } internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken) { bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (flag) { flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } return flag; } internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken) { JsonToken tokenType = TokenType; if (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { return MoveToContentFromNonContentAsync(cancellationToken); } return AsyncUtils.True; } private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken) { JsonToken tokenType; do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { return false; } tokenType = TokenType; } while (tokenType == JsonToken.None || tokenType == JsonToken.Comment); return true; } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; _maxDepth = 64; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is int) { return (int)value; } int num; if (value is BigInteger bigInteger) { num = (int)bigInteger; } else { try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string? ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[]? ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is double) { return (double)value; } double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger)); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L)); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is decimal) { return (decimal)value; } decimal num; if (value is BigInteger bigInteger) { num = (decimal)bigInteger; } else { try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTimeOffset dateTimeOffset) { SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false); } return (DateTime)Value; case JsonToken.String: return ReadDateTimeString((string)Value); default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTimeOffset? ReadAsDateTimeOffset() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTime dateTime) { SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false); } return (DateTimeOffset)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeOffsetString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal DateTimeOffset? ReadDateTimeOffsetString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract? contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; case ReadType.ReadAsDateTimeOffset: ReadAsDateTimeOffset(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection? _converters; internal IContractResolver _contractResolver; internal ITraceWriter? _traceWriter; internal IEqualityComparer? _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver? _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string? _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver? ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter? TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer? EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting.GetValueOrDefault(); } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling.GetValueOrDefault(); } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling.GetValueOrDefault(); } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling.GetValueOrDefault(); } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling.GetValueOrDefault(); } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent.GetValueOrDefault(); } set { _checkAdditionalContent = value; } } public virtual event EventHandler<Newtonsoft.Json.Serialization.ErrorEventArgs>? Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object? Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T? Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader, Type? objectType) { return DeserializeInternal(reader, objectType); } internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object? value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object? value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object? value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != 0) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter? GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(Newtonsoft.Json.Serialization.ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal const int DefaultMaxDepth = 64; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo? _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string? _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal StreamingContext? _context; internal ConstructorHandling? _constructorHandling; internal TypeNameHandling? _typeNameHandling; internal MetadataPropertyHandling? _metadataPropertyHandling; public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public IList<JsonConverter> Converters { get; set; } public PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling.GetValueOrDef