diff --git a/src/HtmlAgilityPack.Shared/HtmlAttributeCollection.cs b/src/HtmlAgilityPack.Shared/HtmlAttributeCollection.cs index bcc68fec..787a1778 100644 --- a/src/HtmlAgilityPack.Shared/HtmlAttributeCollection.cs +++ b/src/HtmlAgilityPack.Shared/HtmlAttributeCollection.cs @@ -20,7 +20,7 @@ public class HtmlAttributeCollection : IList internal Dictionary Hashitems = new Dictionary(StringComparer.OrdinalIgnoreCase); private HtmlNode _ownernode; - private List items = new List(); + internal List items = new List(); #endregion diff --git a/src/HtmlAgilityPack.Shared/HtmlNode.cs b/src/HtmlAgilityPack.Shared/HtmlNode.cs index 2a4b3bd9..3eb4c8af 100644 --- a/src/HtmlAgilityPack.Shared/HtmlNode.cs +++ b/src/HtmlAgilityPack.Shared/HtmlNode.cs @@ -8,6 +8,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; @@ -1253,6 +1254,50 @@ public IEnumerable Elements(string name) yield return node; } + /// Gets data attribute. + /// The key. + /// The data attribute. + public HtmlAttribute GetDataAttribute(string key) + { + return Attributes.Hashitems.SingleOrDefault(x => x.Key.Equals("data-" + key, StringComparison.OrdinalIgnoreCase)).Value; + } + + /// Gets the data attributes in this collection. + /// + /// An enumerator that allows foreach to be used to process the data attributes in this + /// collection. + /// + public IEnumerable GetDataAttributes() + { + return Attributes.Hashitems.Where(x => x.Key.StartsWith("data-", StringComparison.OrdinalIgnoreCase)).Select(x => x.Value).ToList(); + } + + /// Gets the attributes in this collection. + /// + /// An enumerator that allows foreach to be used to process the attributes in this collection. + /// + public IEnumerable GetAttributes() + { + return Attributes.items; + } + + /// Gets the attributes in this collection. + /// A variable-length parameters list containing attribute names. + /// + /// An enumerator that allows foreach to be used to process the attributes in this collection. + /// + public IEnumerable GetAttributes(params string[] attributeNames) + { + List list = new List(); + + foreach(var name in attributeNames) + { + list.Add(Attributes[name]); + } + + return list; + } + /// /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. /// @@ -1261,6 +1306,22 @@ public IEnumerable Elements(string name) /// The value of the attribute if found, the default value if not found. public string GetAttributeValue(string name, string def) { +#if METRO || NETSTANDARD1_3 || NETSTANDARD1_6 + return GetAttributeValue(name, def); +#else + return GetAttributeValue(name, def); +#endif + } + +#if METRO || NETSTANDARD1_3 || NETSTANDARD1_6 + /// + /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. + /// + /// The name of the attribute to get. May not be null. + /// The default value to return if not found. + /// The value of the attribute if found, the default value if not found. + public int GetAttributeValue(string name, int def) + { if (name == null) { throw new ArgumentNullException("name"); @@ -1277,7 +1338,14 @@ public string GetAttributeValue(string name, string def) return def; } - return att.Value; + try + { + return Convert.ToInt32(att.Value); + } + catch + { + return def; + } } /// @@ -1286,7 +1354,7 @@ public string GetAttributeValue(string name, string def) /// The name of the attribute to get. May not be null. /// The default value to return if not found. /// The value of the attribute if found, the default value if not found. - public int GetAttributeValue(string name, int def) + public bool GetAttributeValue(string name, bool def) { if (name == null) { @@ -1306,21 +1374,22 @@ public int GetAttributeValue(string name, int def) try { - return Convert.ToInt32(att.Value); + return Convert.ToBoolean(att.Value); } catch { return def; } } - - /// - /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned. - /// - /// The name of the attribute to get. May not be null. - /// The default value to return if not found. - /// The value of the attribute if found, the default value if not found. - public bool GetAttributeValue(string name, bool def) +#else + /// + /// Helper method to get the value of an attribute of this node. If the attribute is not found, + /// the default value will be returned. + /// + /// The name of the attribute to get. May not be null. + /// The default value to return if not found. + /// The value of the attribute if found, the default value if not found. + public T GetAttributeValue(string name, T def) { if (name == null) { @@ -1337,24 +1406,34 @@ public bool GetAttributeValue(string name, bool def) { return def; } + + TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); try { - return Convert.ToBoolean(att.Value); + if (converter != null && converter.CanConvertTo(att.Value.GetType())) + { + return (T)converter.ConvertTo(att.Value, typeof(T)); + } + else + { + return (T) (object) att.Value; + } } catch { return def; } } +#endif - /// - /// Inserts the specified node immediately after the specified reference node. - /// - /// The node to insert. May not be null. - /// The node that is the reference node. The newNode is placed after the refNode. - /// The node being inserted. - public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild) + /// + /// Inserts the specified node immediately after the specified reference node. + /// + /// The node to insert. May not be null. + /// The node that is the reference node. The newNode is placed after the refNode. + /// The node being inserted. + public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild) { if (newChild == null) { @@ -1966,9 +2045,9 @@ public void SetParent(HtmlNode parent) } } - #endregion +#endregion - #region Internal Methods +#region Internal Methods internal void SetChanged() { @@ -2212,9 +2291,9 @@ internal void WriteAttributes(TextWriter outText, bool closing) } } - #endregion +#endregion - #region Private Methods +#region Private Methods private string GetRelativeXpath() { @@ -2253,9 +2332,9 @@ private bool IsSingleElementNode() return count <= 1 ? true : false; } - #endregion +#endregion - #region Class Helper +#region Class Helper /// /// Adds one or more classes to this node. @@ -2497,6 +2576,6 @@ private bool IsEmpty(IEnumerable en) return true; } - #endregion +#endregion } } \ No newline at end of file