Доброго времени суток, решил написать для практики парсер что бы узнать нынешний курс валюты и не зря решил. Столкнулся с проблемой установки типа идентификатора для XML документа т.к. метод XmlDocument.GetElementById(string elementId); выкидывает исключение NullRefernceExeption.
Алгоритм очень прост, если я буду искать регулярными выражениями от и до закрывающего атрибута (например "<tr id=\"vg_b_30\" class=\"" + @"(even|odd)" + "\">" + @"(.|\s)+</tr>") уходило очень много времени - я просто обрезал то что не нужно сверху, потом то что не нужно снизу и добавил шапку XML-документа, но дальше я хочу использовать метод с котором у меня возникла проблема.
DateTime now = DateTime.Now;
string Currency_Rate;
string document;
string pattern = "<tr id=\"vg_b_30\" class=\"" + @"(even|odd)" + "\">" + @"(.|\s)+";
using (WebClient Request = new WebClient { Encoding = Encoding.UTF8 })
document = Request.DownloadString("http://myfin.by/bank/currency/mogilev");
document = Regex.Match(document, pattern, RegexOptions.IgnoreCase).ToString();
int tr_position = document.IndexOf("</tr>") + 6;
document = document.Remove(tr_position);
document = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<!DOCTYPE root [\r\n <!ATTLIST td class ID #REQUIRED>\r\n]>\r\n" + document;
pattern = @"(vg_mt_usd_buy number vg_mt_best|vg_mt_usd_buy number normal)";
document = Regex.Replace(document, pattern, "THIS IT");
//vg_mt_usd_buy number vg_mt_best"
//vg_mt_usd_sell number normal
XmlDocument XmlDock = new XmlDocument();
XmlDock.LoadXml(document);
Currency_Rate = XmlDock.GetElementById("THIS IT").InnerText;
Console.WriteLine(now - DateTime.Now);
Получившийся XML-документ
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE root [
<!ATTLIST td class ID #REQUIRED>
]>
<tr id="vg_b_30" class="odd">
<td class="THIS IT">17 790</td>
<td class="vg_mt_usd_sell number normal">17 870</td>
<td class="vg_mt_eur_buy number vg_mt_best">20 060</td>
<td class="vg_mt_eur_sell number normal">20 190</td>
<td class="vg_mt_rur_buy number normal">261.0</td>
<td class="vg_mt_rur_sell number normal">265.0</td>
<td class="vg_mt_eurusd_buy number vg_mt_best">1.1230</td>
<td class="vg_mt_eurusd_sell number vg_mt_best">1.1340</td>
</tr>
Требуется достать значение из атрибута td помеченного THIS IT.
Запись <!DOCTYPE root [<!ATTLIST td class ID #REQUIRED>]> взята с MSDN