Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Нужна помощь - Парсинг XML (https://javascript.ru/forum/jquery/29987-nuzhna-pomoshh-parsing-xml.html)

spo 20.07.2012 04:53

Нужна помощь - Парсинг 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 () {...});
}

spo 20.07.2012 05:13

"XmlExRates.xml" это у меня осталось от теста на локалке.

Если ответ приходит в нужном виде, то почему может не парситься?

То есть, когда пишу url: со ссылкой приведенной выше - не работает. Но если перейти по ссылке и сохранить страницу в xml, а затем в url: прописать вместо ссылки путь к сохраненному файлу, то все прекрасно работает.

Deff 20.07.2012 11:13

Есть такое решение => http://james.padolsey.com/javascript...s-with-jquery/

spo 20.07.2012 23:11

А может ли у меня не работать потому что я запускаю статический файл html со скриптом на локалке, а не на сервере?

Deff 20.07.2012 23:31

рабочий код для данной ссылки => 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>

spo 21.07.2012 00:52

Большое спасибо - задача решена.
Хотел уточнить пару непонятных моментов. Вы давали ссылку на решение, там все было понятно, но последний код на JS и я не совсем понимаю его работу.

К примеру:
test() - понятно когда он работает с regExp, но тут он один и еще мне не удалось найти какую роль выполняет второй атрибут - функция
expect() и ok() - это видимо функции jQuery.ajax.js
alert(res.responseText) не содержит в конце точки с запятой это ошибка?

Deff 21.07.2012 00:54

Цитата:

Сообщение от spo
alert(res.responseText) не содержит в конце точки с запятой это ошибка?

поставьте - (*точки с запятой Важны, ежели планируется последущее ужатии кода
или за оператором в этой же строке - стоит следущий;

Deff 21.07.2012 01:25

<!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>

spo 21.07.2012 18:40

Класс! Спасибо еще раз.
Правда остался 1 момент непонятный :)
Почему a.append(res.responseText) и a.find('p').html() если мы до этого удалили var a=$('#Storag').remove();

spo 21.07.2012 18:54

Вот так тоже работает:
<!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>

Deff 21.07.2012 19:02

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

spo 21.07.2012 19:17

Ок, понял. Thx.

spo 23.07.2012 04:42

Возникла проблема. Приведенный код выдает не xml формат а просто текст.

Если это такой сложный способ, то скажите возможен ли вариант со скриптом который будет скачивать по указанной ссылке xml документ, а дальше уже производить с ним манипуляции без этой кросс-доменности?

Deff 23.07.2012 11:51

spo, Кроссдоменный Запрос выдаёт .responseText, поскольку в итоге парситься json c YACHO...
Цитата:

Сообщение от spo
то скажите возможен ли вариант со скриптом который будет скачивать по указанной ссылке xml документ,

Возможным решением является в частности проксирование, Хотя наверняка есть возможность скачать через API данного сайта, распространяющего инфу о Курсах (Попробуйте внимательно изучить их доки

Deff 23.07.2012 11:59

Цитата:

Сообщение от spo
то скажите возможен ли вариант со скриптом который будет скачивать по указанной ссылке xml

Есть Варианты подгрузки XML чистым аяксом, если на их домене и Вашем прописаны разрешения на это дело... http://uppod.ru/talk_189

spo 10.08.2012 13:29

Связался с саппортом сайта. Получил ответ:
Цитата:

Все методы, которые предоставляет наш веб-сервис описаны на странице: http://www.nbrb.by/statistics/Rates/XML/.

Опишите, пожалуйста, детальнее Вашу проблему. Если Вы хотите получить определенный элемент xml-документа средствами javascript, то предостаточно примеров на форумах того же Microsoft:
http://social.msdn.microsoft.com/For...9-c2e4d3b6f4d0
Пример на сайте Microsoft пробовал - тоже не работает.

Deff 10.08.2012 14:00

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>

spo 10.08.2012 17:15

Цитата:

Сообщение от Deff
Нарисуйте итоговый вид данного контента на Вашей странице

RUR=123124; USR=123123

Deff 10.08.2012 17:48

Цитата:

Сообщение от spo
RUR=123124; USR=123123

:) Ничо не понял - сначала исходный кусок из таблицы для этого (и ссылку на страницу с XML ) чот тут близко подобного не вижу
Потом уже как у Вас выглядит

spo 10.08.2012 19:30

Вот ссылка на XML: http://nbrb.by/Services/XmlExRates.aspx
А насчет таблицы не понял :) Мне главное чтобы структура была: Лэйбл валюты обернутый в контейнер и Значение курса валюты тоже обернутое в контейнер. Одна или несколько валют.

Deff 10.08.2012 19:34

Цитата:

Сообщение от spo
Мне главное чтобы структура была: Лэйбл валюты обернутый в контейнер и Значение курса валюты тоже обернутое в контейнер. Одна или несколько валют.

Изобразите в тегах HTML - я постараюсь переделать ( там уже(см предыдущую демку) по строкам есть - а строку разбить - как два пальца

spo 10.08.2012 20:13

<div>
<div>RUB</div>
<div>260.5</div>
</div>

<div>
<div>USD</div>
<div>8310</div>
</div>

Deff 10.08.2012 20:18

spo,
Оки

Deff 10.08.2012 21:36

<!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.