private GeckoHtmlElement GetElementByXpath(GeckoDocument doc, string xpath) { if (doc == null) return null; xpath = xpath.Replace("/html/", ""); GeckoElementCollection eleColec = doc.GetElementsByTagName("html"); if (eleColec.Length == 0) return null; GeckoHtmlElement ele = eleColec[0]; string[] tagList = xpath.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); foreach (string tag in tagList) { System.Text.RegularExpressions.Match mat = System.Text.RegularExpressions.Regex.Match(tag, "(?<tag>.+)\\[@id='(?<id>.+)'\\]"); if (mat.Success == true) { string id = mat.Groups["id"].Value; GeckoHtmlElement tmpEle = doc.GetHtmlElementById(id); if (tmpEle != null) ele = tmpEle; else { ele = null; break; } } else { mat = System.Text.RegularExpressions.Regex.Match(tag, "(?<tag>.+)\\[(?<ind>[0-9]+)\\]"); if (mat.Success == false) { GeckoHtmlElement tmpEle = null; foreach (GeckoNode it in ele.ChildNodes) { if (it.NodeName.ToLower() == tag) { tmpEle = (GeckoHtmlElement)it; break; } } if (tmpEle != null) ele = tmpEle; else { ele = null; break; } } else { string tagName = mat.Groups["tag"].Value; int ind = int.Parse(mat.Groups["ind"].Value); int count = 0; GeckoHtmlElement tmpEle = null; foreach (GeckoNode it in ele.ChildNodes) { if (it.NodeName.ToLower() == tagName) { count++; if (ind == count) { tmpEle = (GeckoHtmlElement)it; break; } } } if (tmpEle != null) ele = tmpEle; else { ele = null; break; } } } } return ele; }