// 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
}
}