Нужна помощь - Парсинг XML
Есть сайт предоставляющий информацию о курсах валют в формате XML (nbrb.by/statistics/Rates/XML/)
Но в ссылке которую нужно парсить вместо *.xml написано *.aspx (nbrb.by/Services/XmlExRates.aspx?ondate=01/31/2011) Если сохранить файл в формате XML и парсить локально то все ок, а по ссылке никак. Должно быть решение совсем простое, но это мой первый опыт с парсингом XML. Прошу помощи. Использую следующий код: $(document).ready(function () { $.ajax({ type: "GET", url: "XmlExRates.xml", dataType: "xml", success: xmlParser }); }); function xmlParser(xml) { $(xml).find("Currency").each(function () {...}); } |
"XmlExRates.xml" это у меня осталось от теста на локалке.
Если ответ приходит в нужном виде, то почему может не парситься? То есть, когда пишу url: со ссылкой приведенной выше - не работает. Но если перейти по ссылке и сохранить страницу в xml, а затем в url: прописать вместо ссылки путь к сохраненному файлу, то все прекрасно работает. |
Есть такое решение => http://james.padolsey.com/javascript...s-with-jquery/
|
А может ли у меня не работать потому что я запускаю статический файл html со скриптом на локалке, а не на сервере?
|
рабочий код для данной ссылки => http://nbrb.by/Services/XmlExRates.a...ate=01/31/2011
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>ТЕСТ</title> </head> <body> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://hostjs-mybb2011.narod.ru/js/jQuery.ajax.js"></script> ЖДИТЕ! <script> test('GET', function(){ expect(1); stop(); jQuery.get('http://nbrb.by/Services/XmlExRates.aspx?ondate=01/31/2011', function(res){alert(res.responseText) ok( !!(res && res.responseText), 'GET Request to Google.com succeeded!' ); start(); }); }); </script> </body> </html> |
Большое спасибо - задача решена.
Хотел уточнить пару непонятных моментов. Вы давали ссылку на решение, там все было понятно, но последний код на JS и я не совсем понимаю его работу. К примеру: test() - понятно когда он работает с regExp, но тут он один и еще мне не удалось найти какую роль выполняет второй атрибут - функция expect() и ok() - это видимо функции jQuery.ajax.js alert(res.responseText) не содержит в конце точки с запятой это ошибка? |
Цитата:
или за оператором в этой же строке - стоит следущий; |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>ТЕСТ</title> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://hostjs-mybb2011.narod.ru/js/jQuery.ajax.js"></script> <style> body { margin-top:23px; } #OutDiv { width:540px; margin:0 auto; padding:1em; border-radius:15px; -webkit-border-radius:15px; -khtml-border-radius:15px; -moz-border-radius:15px; -o-border-radius:15px; -ms-border-radius:5px; box-shadow: 0px 5px 18px #000; -webkit-box-shadow:0px 5px 18px #000; -khtml-box-shadow:0px 5px 18px #000; -moz-box-shadow:0px 5px 18px #000; -ms-box-shadow:0px 5px 18px #000; } </style> </head> <body> ЖДИТЕ!<br /><br /> <div id=Storag></div> <div id=OutDiv></div> <script> jQuery.get('http://nbrb.by/Services/XmlExRates.aspx?ondate=01/31/2011', function(res){ var a=$('#Storag').remove();a.append(res.responseText) var b=a.find('p').html();$("#OutDiv").append(b);//alert(b); }); </script> </body> </html> |
Класс! Спасибо еще раз.
Правда остался 1 момент непонятный :) Почему a.append(res.responseText) и a.find('p').html() если мы до этого удалили var a=$('#Storag').remove(); |
Вот так тоже работает:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://hostjs-mybb2011.narod.ru/js/jQuery.ajax.js"></script> <script type="text/javascript"> $.get('http://nbrb.by/Services/XmlExRates.aspx?ondate=01/31/2011', function(res){ $("#outdiv").append(res.responseText); }); </script> <style type="text/css"> body {margin:50px;} #outdiv { width: 500px; margin: 0 auto; padding: 10px; border: 1px solid #E9E9E9; } </style> </head> <body> <div id="outdiv"></div> </body> </html> |
spo,
Ну там подгружается head - который текущими манипуляциями изъят и грузиться только контент P <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://hostjs-mybb2011.narod.ru/js/jQuery.ajax.js"></script> <style type="text/css"> body {margin:50px;} #outdiv { width: 500px; margin: 0 auto; padding: 10px; border: 1px solid #E9E9E9; } </style> </head> <body> <div id="outdiv"></div> <script type="text/javascript"> $.get('http://nbrb.by/Services/XmlExRates.aspx?ondate=01/31/2011', function(res){ alert(res.responseText) $("#outdiv").append(res.responseText); }); </script> </body> </html> Ксать скрипт нужно ставить ниже div - или запускать после загрузки DOM |
Ок, понял. Thx.
|
Возникла проблема. Приведенный код выдает не xml формат а просто текст.
Если это такой сложный способ, то скажите возможен ли вариант со скриптом который будет скачивать по указанной ссылке xml документ, а дальше уже производить с ним манипуляции без этой кросс-доменности? |
spo, Кроссдоменный Запрос выдаёт .responseText, поскольку в итоге парситься json c YACHO...
Цитата:
|
Цитата:
|
Связался с саппортом сайта. Получил ответ:
Цитата:
|
spo,
По мне - так проще перераспарсить регуляркой полученный текст в нужные теги *посколь есть жесткая структура строки... - Нарисуйте итоговый вид данного контента на Вашей странице <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <div id=Input style="display:none;"> 036 AUD 1 Австралийский доллар 2986.46 975 BGN 1 Болгарский лев 2108.99 980 UAH 1 Гривна 378.5 208 DKK 1 Датская крона 553.35 840 USD 1 Доллар США 3011 978 EUR 1 Евро 4121.16 960 XDR 1 Единица СПЗ (SDR) от МВФ 4709.38 985 PLN 1 Злотый 1053.85 392 JPY 10 Иена 364.24 352 ISK 1 Исландская крона 25.99 124 CAD 1 Канадский доллар 3020.82 156 CNY 1 Китайский юань 457.29 233 EEK 1 Крона 257.3 414 KWD 1 Кувейтский динар 10765.49 428 LVL 1 Латвийский лат 5850.58 440 LTL 1 Литовский лит 1194.51 498 MDL 1 Молдавский лей 251.55 578 NOK 1 Норвежская крона 519.67 643 RUB 1 Российский рубль 101.49 702 SGD 1 Сингапурcкий доллар 2349.96 417 KGS 1 Сом 63.41 398 KZT 1 Тенге 20.51 949 TRY 1 Турецкая лира 1894.01 826 GBP 1 Фунт стерлингов 4780.11 203 CZK 1 Чешская крона 170.14 752 SEK 1 Шведская крона 464.76 756 CHF 1 Швейцарский франк 3181.7 </div> <script type="text/javascript"> var a=$("#Input").text() s=a.replace(/( \d{3} [A-Z]{3} 1 )/gm,",\n$1").substring(3).split(',') alert(s) </script> |
Цитата:
|
Цитата:
Потом уже как у Вас выглядит |
Вот ссылка на XML: http://nbrb.by/Services/XmlExRates.aspx
А насчет таблицы не понял :) Мне главное чтобы структура была: Лэйбл валюты обернутый в контейнер и Значение курса валюты тоже обернутое в контейнер. Одна или несколько валют. |
Цитата:
|
<div> <div>RUB</div> <div>260.5</div> </div> <div> <div>USD</div> <div>8310</div> </div> |
spo,
Оки |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript" src="http://hostjs-mybb2011.narod.ru/js/jQuery.ajax.js"></script> <style type="text/css"> body { margin:50px; } #outdiv { width: 500px; margin: 0 auto; padding: 10px; border: 1px solid #E9E9E9; } div[id^="valuta"] div.in{ float:left; padding-right:7px; } </style> </head> <body> <div id="outdiv" style="display:none"></div> <script type="text/javascript"> $.get('http://nbrb.by/Services/XmlExRates.aspx', function(res){ //alert(res.responseText) $("#outdiv").append(res.responseText); var a=$("#outdiv p").text();//alert(a) S=a.replace(/(\d{3} [A-Z]{3} 1 )/gm,",$1").split(',');S.splice(0,1); var str=''; var str=''; for(var i=0; i<S.length; i++){ str+='<div id="valuta-'+i+'">\n<div class=in>'; var VAL = S[i].replace(/\s*\d{3} (\S{3}) (?:10|1) (?:\S* ?){0,6}\S+ ([\d\.]+)/g,'$1,$2').split(","); str+=VAL[0]+'</div>\n<div>'+VAL[1]+'</div>\n</div>\n\n'; } $("#outdiv").html(str).show(); }); </script> </body> </html> |
Часовой пояс GMT +3, время: 17:19. |