// HtmlAgilityPack V1.0 - Simon Mourier #region using System; using System.Diagnostics; #endregion namespace HtmlAgilityPack { /// /// Represents an HTML attribute. /// [DebuggerDisplay("Name: {OriginalName}, Value: {Value}")] public class HtmlAttribute : IComparable { #region Fields private int _line; internal int _lineposition; internal string _name; internal int _namelength; internal int _namestartindex; internal HtmlDocument _ownerdocument; // attribute can exists without a node internal HtmlNode _ownernode; private AttributeValueQuote _quoteType = AttributeValueQuote.DoubleQuote; internal int _streamposition; internal string _value; internal int _valuelength; internal int _valuestartindex; #endregion #region Constructors internal HtmlAttribute(HtmlDocument ownerdocument) { _ownerdocument = ownerdocument; } #endregion #region Properties /// /// Gets the line number of this attribute in the document. /// public int Line { get { return _line; } internal set { _line = value; } } /// /// Gets the column number of this attribute in the document. /// public int LinePosition { get { return _lineposition; } } /// /// Gets the qualified name of the attribute. /// public string Name { get { if (_name == null) { _name = _ownerdocument._text.Substring(_namestartindex, _namelength); } return _name.ToLower(); } set { if (value == null) { throw new ArgumentNullException("value"); } _name = value; if (_ownernode != null) { _ownernode._innerchanged = true; _ownernode._outerchanged = true; } } } /// /// Name of attribute with original case /// public string OriginalName { get { return _name; } } /// /// Gets the HTML document to which this attribute belongs. /// public HtmlDocument OwnerDocument { get { return _ownerdocument; } } /// /// Gets the HTML node to which this attribute belongs. /// public HtmlNode OwnerNode { get { return _ownernode; } } /// /// Specifies what type of quote the data should be wrapped in /// public AttributeValueQuote QuoteType { get { return _quoteType; } set { _quoteType = value; } } /// /// Gets the stream position of this attribute in the document, relative to the start of the document. /// public int StreamPosition { get { return _streamposition; } } /// /// Gets or sets the value of the attribute. /// public string Value { get { if (_value == null) { _value = _ownerdocument._text.Substring(_valuestartindex, _valuelength); } return _value; } set { _value = value; if (_ownernode != null) { _ownernode._innerchanged = true; _ownernode._outerchanged = true; } } } internal string XmlName { get { return HtmlDocument.GetXmlName(Name); } } internal string XmlValue { get { return Value; } } /// /// Gets a valid XPath string that points to this Attribute /// public string XPath { get { string basePath = (OwnerNode == null) ? "/" : OwnerNode.XPath + "/"; return basePath + GetRelativeXpath(); } } #endregion #region IComparable Members /// /// Compares the current instance with another attribute. Comparison is based on attributes' name. /// /// An attribute to compare with this instance. /// A 32-bit signed integer that indicates the relative order of the names comparison. public int CompareTo(object obj) { HtmlAttribute att = obj as HtmlAttribute; if (att == null) { throw new ArgumentException("obj"); } return Name.CompareTo(att.Name); } #endregion #region Public Methods /// /// Creates a duplicate of this attribute. /// /// The cloned attribute. public HtmlAttribute Clone() { HtmlAttribute att = new HtmlAttribute(_ownerdocument); att.Name = Name; att.Value = Value; return att; } /// /// Removes this attribute from it's parents collection /// public void Remove() { _ownernode.Attributes.Remove(this); } #endregion #region Private Methods private string GetRelativeXpath() { if (OwnerNode == null) return Name; int i = 1; foreach (HtmlAttribute node in OwnerNode.Attributes) { if (node.Name != Name) continue; if (node == this) break; i++; } return "@" + Name + "[" + i + "]"; } #endregion } /// /// An Enum representing different types of Quotes used for surrounding attribute values /// public enum AttributeValueQuote { /// /// A single quote mark ' /// SingleQuote, /// /// A double quote mark " /// DoubleQuote } }