Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обработка и вывод информации из XML (https://javascript.ru/forum/misc/34805-obrabotka-i-vyvod-informacii-iz-xml.html)

WaMpIr 20.01.2013 11:58

Обработка и вывод информации из XML
 
Всем доброго времени суток.
Я в этом вообще бом бом бом, так что сильно не пинайте. :)
Есть XML файл взятый при помощи API (uCoz), т.е. адрес получается http://адрес_сайта/api/load/, без file.xml Но это не проблема, создать отдельный файл не долго.
Задача состоит в том, что бы посредством только JS без PHP вытащить из этого файла Текстовое поле (Название материала) и ссылку на материал (в XML файле они присутствуют, логично, ага!?) и вставить их в HTML форму.
Задумка такая: поисковые подсказки как в яндексе (например), т.е. JS+Ajax вытаскивают инфу из XML, сравнивают с введёнными с форму значениями и ниже в div выводят похожие (примерное продолжение). Например ввёл в форму слово "Самый" и мне ниже появилась подсказка типа "Самый страшный фильм", "Самый лучший фильм" и т.д. и т.п.
Можно не обязательно всё, достаточно направить на путь истинный так сказать, а именно, просто показать как вытаскиваются эти значения и выводятся в div, сравнение я и сам смогу прикрутить (наверно :lol: )
Если конечно такое вообще возможно без использования PHP.

Hoshinokoe 20.01.2013 12:48

WaMpIr,

Если используете jQuery - то простой пример, как обработать xml.

Для подсказок как в поиске, есть плагин jquery.autocomplete.

Deff 20.01.2013 13:25

WaMpIr,
Выложите или дайте ссылку на контент файла

WaMpIr 20.01.2013 14:06

Deff, вот только часть кода, потому что он очень длинный. Где TITLE есть название материала, а ENTRY_URL ссылка на материал, больше ничего не нужно. Ну и на всякий случай статейка непосредственно от uCoz'а с описанием значений.
<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>
MATERIAL_ID
</name>
<value>
<i4>
14
</i4>
</value>
</member>
<member>
<name>
TITLE
</name>
<value>
<string>
Postal 3
</string>
</value>
</member>
<member>
<name>
MESSAGE
</name>
<value>
<string>
Безымянный долботряс, известный как Чувак, взорвав атомной бомбой аризонский городок Парадайз, перебирается на ПМЖ в аналогичную дыру с интригующим названием Катарсис.
</string>
</value>
</member>
<member>
<name>
ENTRY_URL
</name>
<value>
<string>
http://rkwo.ucoz.ru/load/18/igry/postal_3/54-1-0-14
</string>
</value>
</member>

Deff 20.01.2013 14:09

Цитата:

Сообщение от WaMpIr
P.S. Почему нет спойлера

WaMpIr,
[HTML hide][/html]

Deff 20.01.2013 14:19

<script src="http://code.jquery.com/jquery-latest.js"></script>


<object id=textXML style="display:none;">

<methodResponse>
<params>
<param>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>
MATERIAL_ID
</name>
<value>
<i4>
14
</i4>
</value>
</member>
<member>
<name>
TITLE
</name>
<value>
<string>
Postal 3
</string>
</value>
</member>
<member>
<name>
MESSAGE
</name>
<value>
<string>
Безымянный долботряс, известный как Чувак, взорвав атомной бомбой аризонский городок Парадайз, перебирается на ПМЖ в аналогичную дыру с интригующим названием Катарсис.
</string>
</value>
</member>
<member>
<name>
ENTRY_URL
</name>
<value>
<string>
http://rkwo.ucoz.ru/load/18/igry/postal_3/54-1-0-14
</string>
</value>
</member>

</object>

<script type="text/javascript">
var Text=''
$(document).ready(function(){
   $("#textXML string").each(function(i){
       if(i==1) {Text=$(this).text();return false;}
   });
alert(Text)
});
</script>

WaMpIr 20.01.2013 14:19

Hoshinokoe, первая ссылка это конечно хорошо, я бы даже сказал то, что надо, вот только структура xml файла слегка отличается.

WaMpIr 20.01.2013 14:38

Deff, спасибо, но это опять же немножко не то. Скрипт непонятно каким образом берёт это значение, а нужно чтобы брал значения для string только из member, значения name которых равно TITLE и ENTRY_URL.

Deff 20.01.2013 14:57

Цитата:

Сообщение от WaMpIr
спасибо, но это опять же немножко не то. Скрипт непонятно каким образом берёт это значение, а нужно чтобы брал значения для string только из member, значения name которых равно TITLE и ENTRY_URL.

Укажите, что должен выводить в итоге!

WaMpIr 20.01.2013 15:02

В итоге должен получиться div блок со множеством всех значений TITLE, тобишь название материала. Сейчас подумал, оказывается ссылка там и не нужна, нужно просто название материала. Ещё одна мини проблема в том, что этот файл является динамическим, периодически, по мере добавления материала, в нём добавляются соответствующие пункты, но это можно исправить при помощи ajax(надеюсь). Сейчас самое главное выцепить эти значения из файла и вставить в виде списка или ещё как-нибудь.

WaMpIr 20.01.2013 15:54

Вот хелпер, код онлайн статистики, который работает как раз с API и заточен именно под uCoz. Вот только не могу сообразить как сделать так, чтобы выводились все названия. Ссылка на XML, если не открывается, то использовать мможно кусок кода, который я дал выше.
document.write('<div id="useridonlines"></div><div id="usernumonline" ></div><div style="display:none;"><div id="useridonline"></div><div id="usergroupid"></div><div id="usergroupname"></div><div id="useravatar"></div><div id="username"></div></div>');
  var colichestvoonline='0';
  var xml=$.ajax({type:'GET',url:'/api/index/62',dataType:'xml',async:false}).responseText;
  var groupid=$(xml).find('struct:first member:contains("USER_ID") i4').contents().text(function(){$(this).text($(this).text()+', ')});
  var kolonline=groupid.length;$("#useridonline").append(groupid);
  function useridonline(a){$("#useridonline").html(groupid[a])}
  var i='0';
  function foruseronline(a){
  i=a;if(i<kolonline){
  useridonline(i);
  var b=$("#useridonline").html();
  var c=$.ajax({type:'GET',url:'/api/index/8-'+b,dataType:'xml',async:false}).responseText;
  $("#usergroupid").html($(c).find('struct:first member:contains("USER_GROUPID")').find('i4').text());
  $("#username").html($(c).find('struct:first member:contains("USER_USERNAME")').find('string').text());
  $("#useravatar").html($(c).find('struct:first member:contains("USER_AVATAR")').find('string').text());
  $("#usergroupname").html($(c).find('struct:first member:contains("USER_GROUPNAME")').find('string').text());
  var d=$("#usergroupid").html();
  var e=$("#username").html();
  var f=$("#useravatar").html();
  var g=$("#usergroupname").html();
  if(f==''){f='/online/avatar_01.png'}
  $("#useridonlines").prepend($("#template").html().replace(/#USERGROUPID#/g,d).replace(/#USERNAME#/g,e).replace(/#USERID#/g,b).replace(/#USERAVATARURL#/g,f).replace(/#USERGROUPNAME#/g,g));
  var i=i+1;
  if(i<kolonline){
  setTimeout('foruseronline('+i+')',1000);
  }else{
$("#usernumonline").html('Нет юзеров.');
if(kolonline=='1'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзер онлайн.')
  }
  if(kolonline>'1'&&kolonline<'5'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзера онлайн.')
  }
  if(kolonline>'4'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзеров онлайн.')
  }
  }
  }
  }
  foruseronline(i);

WaMpIr 20.01.2013 16:37

Вот что у меня получилось:write: :
  document.write('<div id="useridonlines"></div><div id="usernumonline" ></div><div style="display:none;"><div id="usergroupname"></div></div>');
  var colichestvoonline='0';
  var xml=$.ajax({type:'GET',url:'/api/load/',dataType:'xml',async:false}).responseText;
  var groupid=$(xml).find('struct:first member:contains("ENTRY_URL")').contents().text(function(){$(this).text($(this).text()+', ')});
  var kolonline=groupid.length;$("#useridonline").append(groupid);
  function useridonline(a){$("#useridonline").html(groupid[a])}
  var i='0';
  function foruseronline(a){
  i=a;if(i<kolonline){
  useridonline(i);
  var b=$("#useridonline").html();
  var c=$.ajax({type:'GET',url:'/api/load/',dataType:'xml',async:false}).responseText;
  $("#usergroupid").html($(c).find('struct:first member:contains("i4")').find('string').text());
  $("#username").html($(c).find('struct:first member:contains("ENTRY_URL")').find('string').text());
  $("#useravatar").html($(c).find('struct:first member:contains("USER_AVATAR")').find('string').text());
  $("#usergroupname").html($(c).find('member:contains("TITLE")').find('string').text());
  var d=$("#usergroupid").html();
  var e=$("#username").html();
  var f=$("#useravatar").html();
  var g=$("#usergroupname").html();
  if(f==''){f='/online/avatar_01.png'}
  $("#useridonlines").prepend($("#template").html().replace(/#USERGROUPNAME#/g,g));
  var i=i+1;
  if(i<kolonline){
  setTimeout('foruseronline('+i+')',1000);
  }else{
$("#usernumonline").html('Нет юзеров.');
if(kolonline=='1'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзер онлайн.')
  }
  if(kolonline>'1'&&kolonline<'5'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзера онлайн.')
  }
  if(kolonline>'4'){
  $("#usernumonline").html('Всего <b>'+kolonline+'</b> юзеров онлайн.')
  }
  }
  }
  }
  foruseronline(i);

Но это какой-то бардак получается, строк с названиями вовсе две загружается, и названия идут одно за другим. Что делааааать????


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