Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Общий вопрос о парсинге XML (https://javascript.ru/forum/misc/52123-obshhijj-vopros-o-parsinge-xml.html)

karakym 05.12.2014 00:14

Общий вопрос о парсинге XML
 
Доброго времени суток, получил задачу сделать в таблице цен на сайте 3 валюты с возможностью их выбора (UAH, RUR, EUR)
Сам select с динамическим текстом сделал, но тут получается так, что основная валюта UAH и цены изначально задаются в ней, то есть нужно конвертировать в RUR и EUR, а из за того что экономика в стране (UA) "Скачет" ибо она не москаль, решил автоматизировать весь процесс!
Нашел API ПриватБанк, начал от туда парсить XML файлик методом jQuery.ajax
Но столкнулся с проблемой, по прямой ссылке jQuery не парсит XML файл по url, но если его скачать себе на сервер(указать локальный путь), то он отлично работает!
Вопрос простой: Почему? и как парсить напрямую?
Собс-но сам код:
jQuery(document).ready(function(){
  jQuery.ajax({
    type: "GET", // метод передачи данных, можно пропутсить - по умолчанию и так get
    url: "pubinfo.xml", // путь к файлу, который будем читать
    dataType: "xml", // тип данных, с котрыми работаем
    success: function(xml) { // переменная названа xml. ее можно назвать как либо по другому

  jQuery(xml).find('exchangerate').each(
    function()
      {					
        var ccy = jQuery(this).attr('ccy'),
        price = jQuery(this).attr('buy');
        jQuery('<div class="items"></div>').html('<span>'+ccy+'</span><br><span>'+price+'</span>').appendTo('#xml-data');
        /*Здесь хочу сделать: 
        1. Убрать в "price" все что после запятой вместе с ней 
        2. В переменных ниже price1... указаны цены (на товар) для 4-х тарифов
        их я хочу использовать что бы вывести стоимость в других валютах (RUR и EUR)
        Но тут остановочка, ведь не уверен правильно ли я делаю.
        */
        var price1 = 2500,
        price2 = 5000,
        price3 = 7500,
        price4 = 10000,
        rur = price1*price[0],
        eur = price1/price[1];
        alert('rub-'+rur+'; 'evro-'+eur)
    });			
    }
  });
});

Тут же еще несколько вопросов, собс-но поэтому тему создал в этом разделе:
2. Есть директория "src" в ней файл parse.js который подключен в файле index.htm который в свою очередь находится в корне так же как и папка, проблема в том что если в коде указать url: "/pubinfo.xml", то скрипт так же отказывается парсить файл!
3. И еще как убрать вывод доллара (довольно таки противная валюта) использовать не собираюсь.
4. Как видите в коде есть комментарии, буду благодарен если поможете с ними!
P.S. Сильно не пинайте я начинающий!:stop:

danik.js 05.12.2014 05:40

Для кроссдоменных запросов строронний сервер должен выставить особые http заголовки, разрешающие запрос. Возмощно приват банк их не выставляет. Убедись что запрос завершается успешно (смотри вкладку Сеть по F12. Путь правильно указал?
2. Файл тогда в корне сайта должен лежать, ибо слэш в начале адреса означает абсолютный путь.

karakym 05.12.2014 14:43

Сменил код для удобства вытаскивания необходимых переменных:
$(document).ready(function()
	{
			$.get('pubinfo.xml', function(data)
			{
				a = $(data).find('exchangerate');
				
				prc = new Array();
				val = new Array();
				prc[0] = a[0].getAttribute("buy");
				val[0] = a[0].getAttribute("ccy");
				prc[1] = a[1].getAttribute("buy");
				val[1] = a[1].getAttribute("ccy");
				jQuery('<div class="items"></div>').html('<span>'+val[0]+'</span><br><span>'+prc[0]+'</span><br><span>'+val[1]+'</span><br><span>'+prc[1]+'</span>').appendTo('#xml-data');

danik.js 05.12.2014 15:31

karakym, перед объявлением переменных надо ставить ключевое слово var. Ты даже элементарных вещей не знаешь, куда ты лезешь то.

danik.js 05.12.2014 15:32

Цитата:

Сообщение от karakym
a[0]

А че за индексы? Откуда они берутся? Где описаны? Почему ноль, а не один? Или не пять?

karakym 05.12.2014 16:40

Цитата:

Сообщение от danik.js (Сообщение 344804)
А че за индексы? Откуда они берутся? Где описаны? Почему ноль, а не один? Или не пять?

Ищет объект внутри
a = $(data).find('exchangerate');

А теперь получаем его нулевой (первый) атрибут
prc[0] = a[0].getAttribute("buy");

danik.js 05.12.2014 22:50

Цитата:

Сообщение от karakym
А теперь получаем его нулевой (первый) атрибут

Какой нулевой атрибут? Ты атрибут не по индексу получаешь, а по имени (buy). А индекс тут идет в "массиве" элементов exchangerate.
a[0] - первый элемент <exchanerate>. Но почему первый-то, а не к примеру второй?

Vlasenko Fedor 05.12.2014 23:21

язык php. Одиночка Static($xm) + XPATH (автор я :haha: )
simplexml_load_file вызывается один раз
function getValute($name)
{
    static $xml;
    if (!isset($xml)) {
        $file = 'http://pfsoft.com.ua/service/currency/?date=' . date('dmY');
        $xml = simplexml_load_file($file);
        if(!$xml) return;
    }
    $valute = $xml->xpath("/ValCurs/Valute[CharCode='$name']")[0];
    return $valute->Nominal . ' ' . $valute->Name . ' - ' . $valute->Value;
}

echo getValute('USD'), '<br>', getValute('EUR');

Добавлю. Результаты лучше кешировать сразу. Записывать в файл или базу

karakym 06.12.2014 00:18

Цитата:

Сообщение от danik.js (Сообщение 344864)
Какой нулевой атрибут? Ты атрибут не по индексу получаешь, а по имени (buy). А индекс тут идет в "массиве" элементов exchangerate.
a[0] - первый элемент <exchanerate>. Но почему первый-то, а не к примеру второй?

Мне необходимы только 2 валюты, т.е Рубль и Евро, поэтому я беру a[0] и a[1]

danik.js 06.12.2014 00:21

А где сказано что Рубль, это нулевой элемент? В документации так написано?


Часовой пояс GMT +3, время: 14:28.