Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разбор XML, реги, DOM, что лучше? 
:(
    Опции темы
Хрипа
Дата 2.3.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Помогите разобратся с регулярными выражениями плз..
Нужен простой пример как обработать стрoку в вида
<USER name="Жека" Town="Moscow" />

Что бы в скрипте было так:
user['name'] Содержало слово Жека

Это сообщение отредактировал(а) Sardar - 2.3.2007, 01:21
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Sardar
Дата 2.3.2007, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Пока ты не наделал глупостей, это строка из XML документа, что ты через XMLHttpRequest получаешь? Слышал о DOM?


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Хрипа
Дата 2.3.2007, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Знаешь как говарится лучше спросить у ГУРУ нежели самому втыкать сутки что бы разобратся )
Хотелось бы получить пример ПО:
XMLHTTPRequest.responseXML - если ответ сервера пришел в виде правильного XML, возвращает XML DOM объект. 
Методы и функции обьекта DOM Обьекта.

Добавлено @ 03:01 
Точней получить груду  отгенериного текста с БД не php И всё это передать по запрос 
Но как обработать в виде name[value] []
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Код
<UL ID="passw">1</UL>

<script>

  var oList = document.getElementById("passw");
 var oItem1 = oList.firstChild.data;

 alert(oItem1);

</script>

На выходе 1
-----------
Но мне надо обработать сраку 
в виде
<USER name="Жека" Town="Moscow" />
Тойсть что бы данные получались по имени тега USER
так что бы oItem1[имя тега]["name"] содержало значения ЖЕКА
Если есть другие способы реализации помогите ПЛЗ

Это сообщение отредактировал(а) Sardar - 2.3.2007, 22:53
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Код
<UL ID="pass"><div>TEST</div></UL>


<script>

  var oList = document.getElementById("pass");
 var oItem1 = oList.firstChild.childNodes[0].nodeValue;

 alert(oItem1);

</script>


На выходе ТЕСТ
Но как видно я так и не додумался как обработать 
<USER name="Жека" Town="Moscow" />
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Код
<UL ID="pass"><div>TEST</div><user>54</user></UL>


<script>

  var oList = document.getElementById("pass");
 var oItem1 = oList.firstChild.childNodes;
  for(i=0;i<oItem1.length;i++)
  {
 alert(oItem1[i].nodeValue);
 }

</script>

на выходе почему-то только TEST
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
S.A.P.
Дата 2.3.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 8
Всего: 71



Я - бы в данном случае обрабатывал JSON:

строка вида {name:"Жека", Town:"Moscow"}
парсится так:

Код

var text = '{name:"Жека", Town:"Moscow"}';
var user = eval('('+text+')');
alert([user.name, user.Town]);


PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



А где джонсона взять то ?
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
S.A.P.
Дата 2.3.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 8
Всего: 71



Хрипа, тебе сложно на сервере вместо XML - JSON строку сгенерить? На клиенте JSON легко парсится подручными средствами javascript (как я уже показал).

Если этого не достаточно, ссылка: http://json.org
PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Понел но как мне посдавить ?
Ситуция в том что 
комне приходит груда текста который я не знаю и мне надо автоматом его разобрать
var text = '{name:"Жека", Town:"Moscow"}';
Для меня это уже не приемлемо

мне проше использывать split
 var resp =req.responseText.split("|");    
Где Php выводит данные "$user|$town" 
resp[0] = Жека
resp[1] = Moskow
response.innerHTML=resp[2];


--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Хрипа
Дата 2.3.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



можно конечно раскопирывать и получется грамадный код
а мне надо что бы всё одной функцией было что бы Код был минимум строк и максимум работоспасобен
Через сплит не всегда удобно
иногда мне надо name=val
И тогда получается
resp[0] = name
pesp[1] = val

--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Sardar
Дата 2.3.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Отвыкайте от JSON! Это не безопасно, ведь на eval фактически любой код можно пустить, оно вам надо? smile

Цитата(Хрипа @  2.3.2007,  01:53 Найти цитируемый пост)
XMLHTTPRequest.responseXML - если ответ сервера пришел в виде правильного XML, возвращает XML DOM объект. 
Методы и функции обьекта DOM Обьекта.

Элементарно: var users = req.responseXML.getElementsByTagName('USER');
В users имеем список всех <USER>. Далее по задаче:
  • если показываем Жеку единожды, то ничего страшного просто перебором найти его
  • если вообще оперируем с кучей юзеров, то лучше обратить это всё в ассоциативный массив users['~имя']={'town':'Moscow', 'любая':'инфа'};, просто один раз перебором забиваешь массив
  • можно XPath выражением типа /контейнер/USER[@="Жека"] выбрать только жеку и всю связанную инфу. Этот способ лучше всех, ибо быстр и прост, но требует знание XPath.

Как видно в XML вкупе с простым DOM + мощным XPath можно найти что угодно. Это безопасно и именно такой подход можно назвать AJAX'ом.

Хрипа, может выложишь задачу целиком, мы тебе наиболее здравое решение подскажем. А то боюсь давать советы, ибо чую вкривь ты проблему решаешь smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Хрипа
Дата 3.3.2007, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Код

function processReqChange() {
    document.form1.state.value = stat(req.readyState);

    ab = window.setTimeout("req.abort();", 30000);

    if (req.readyState == 4) {
        clearTimeout(ab);

        document.form1.statusnum.value = req.status;
        document.form1.status.value = req.statusText;

        if (req.status == 200) {
              var resp = req.responseText.split('|');
              init(resp); // Функция обработчик
        } else {
            alert("Íå óäàëîñü ïîëó÷èòü äàííûå:\n" + req.statusText);
        }
    }
}
function init(resp)
{
         var error = document.getElementById("error");
         if (resp[0] == 'update_all_sources')
         {
         document.getElementById("online_users").innerHTML='online: '+resp[1];
         document.getElementById("querys").innerHTML=' '+resp[2];
         return true;
         }
         var texts = resp.join("");
         error.innerHTML = texts;
}


Документ с которого тяним инфу и передоём
Код

<?php
session_start();
header("Content-type: text/plain; charset=windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
include("../config.php");
$online = "";
if ((isset($_SESSION["id"]) && !empty($_SESSION["id"])) && ($_COOKIE["ses_id"] == $_SESSION["id"] || $_COOKIE["user"] == $_SESSION["user_id"]))
{
if ($_GET["init"] == "all_objects")
{
$bind = select_tbl("status_in_game","users"," status_in_game = 'online'");
$users_online = mysql_num_rows($bind);
if ($_SESSION["id"] != "" && $_SESSION["user_room"] == "firs_pege")
{
        $online = "<a href=\"game.php\">Çàéòè â èãðó</a>";
}
print "update_all_sources|$users_online|$query_num"; // Название/Параметры/Параметры
}
}
?>


Добавлено @ 07:42 
Отвыкайте от JSON! Это не безопасно, ведь на eval фактически любой код можно пустить, оно вам надо? 
Угу Чюжие либы юзать не стоит я сам вот не юзаю чужие либы... хочу разобратся как работает и свою написать ))

Это сообщение отредактировал(а) Хрипа - 3.3.2007, 07:39
--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Sardar
Дата 3.3.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Представим что на сервере формируем ответ типа:
Код
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response type="param-list" action="update_all_sources">
    <param name="xxx">xxx</param>
    <!-- параметров может быть сколько угодно -->
</response>


Фактически это список пар (ключь=>значение), чего во многих задачах достаточно. Для расширяемости добавил аттрибут type, которым явно указываем чем является содержимое, отсюда подбираем соответствующую extract* функцию. Аттрибут action задаёт действие для списка параметров, просто не хотел ложить в список нод. Заметь что кодировка в UTF-8, не стоит менять на что то другое.

На клиенте собираем ответ:
Код

//заменяем
//var resp = req.responseText.split('|');
//init(resp); // Функция обработчик

if(req.responseXML) {
   var data = extractResponse(req.responseXML);
   init(data);
} else throw "Вороятней получили ответ от сервера 5хх или подобное. Но это не XML точно.";

/* Функция отвечает за правильную выборку инфы, в зависимости от аттрибута type.
* Для примера поддерживаем только список пар ключ=>значение, type="param-list" */
function extractResponse(xml_doc) {
    var body_type = xml_doc.documentElement.getAttribute('type');
    if(body_type != 'param-list') throw "Unknown response body type: " + body_type;
    
    //обычно это выноситься в отдельную функцию, вызываемую из switch по body_type
    var params = xml_doc.documentElement.childNodes, ret = {};
    for(var i = 0; i < params.length; i++) {
        ////в DOM вообще всякая хрень может быть, выбираем только ноды
        if(params[i].nodeType != 1) continue; //Node.ELEMENT_NODE -- эту константу IE не поддерживает, потому задаём числом
        ret['~' + params[i].getAttribute('name')] = params[i].textContent; //до textContent парни из W3C додумались только в DOM3, когда его уже все реализовали...
    }
    return ret;
}

//в твоей init функции видим data['~ключ'], например data['~users-online-count'] даст нам список народа в on-line


На сервере формируем валидный XML:
Код
//заменяем
//print "update_all_sources|$users_online|$query_num"; // Название/Параметры/Параметры

$ret = <<<XMLEOF:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<response type="param-list" action="update_all_sources">
     <param name="users-online-count">{$users_online}</param>
     <param name="queries-used-count">{$query_num}</param>
</response>
XMLEOF;

//убедись что исходник в UTF-8 если отсылаетшь русский текст. иначе конвертируй через iconv.


Вся шутка в том, что можешь формировать любой ответ, передавать любую инфу. Всё это расширяемо и удобно.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Хрипа
Дата 4.3.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: нет
Всего: нет



Спасибо помогло очень!
Кстати а что быстрей работает если я отсылаю строку: Названия/Параметры
Или XML ?

Добавлено @ 13:22 
Мне надо максимально быстрая работа что бы не создовалось лишней нагрузки на сервак..

--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.