Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.02.2011, 23:17
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

[XML][DOM] Неожиданно перестал понимать! (С картинками)
Здравствуйте!


Сейчас столкнулся с ситуацией, в которой понял, что я ничего не понимаю в XML и DOM. Начал проверять сам себя на примитивных примерах. Вот один из них.

Нужно создать html-файл следующего содержания, и открыть его в браузере:

Код:
<html><body>

<xml id="lb_logicus_modulus">
<?xml version="1.0" encoding="utf-8"?>
<root>
 <version val="1"/>
 <team id="12345">
  <player id="0">
   <table direction="1">
    <line val="ABC"/>
    <line val="DEF"/>
    <line val="GHI"/>
   </table>
   <table direction="3">
    <line val="JKL"/>
    <line val="MNO"/>
    <line val="QRS"/>
   </table>
  </player>
 </team>
</root>
</xml>

</body></html>
Открываем отладчик, и смотрим DOM-дерево. Что мы видим?

FireFox 3.6 покажет нам следующее:



Тут сразу возникает куча вопросов:

- Почему элемент version включает в себя все остальные элементы team, вместо того чтоб быть с ними на одном уровне?
- Почему элементы line включают себя рекурсивно, вместо того чтоб быть на одном уровне?
- (Вообще эпично) Почему элемент table идёт после всех своих элементов line, хотя на деле элементы line должны находиться внутри table?


Opera 11 покажет нам следующее:



Тут не так печально, как в FireFox, но нарушение первоначальной структуры тоже неслабое:

- Почему элемент version включает в себя все остальные элементы team, вместо того чтоб быть с ними на одном уровне?
- Почему элементы line включают себя рекурсивно, вместо того чтоб быть на одном уровне?


Пояснение: это кусок JavaScript-проекта, в котором используется jQuery, и некоторые слабоструктурированные данные вставляются в код страницы в виде блока <xml>...</xml>.

Вопрос. Почему браузеры так некорректно раскладывают DOM-представление такого простого примера? Как исправить?
Ответить с цитированием
  #2 (permalink)  
Старый 02.02.2011, 23:32
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

Сообщение от xintrea
это кусок JavaScript-проекта, в котором используется jQuery, и некоторые слабоструктурированные данные вставляются в код страницы в виде блока <xml>...</xml>.
впервые слышу о таком HTML-теге, и возможность включать в него XML-документы

требую пруфлинк на документацию по тегу(а именно какому стандарту он соовтествует), и пруфлинк о поддержке его различными браузерами

Последний раз редактировалось Gvozd, 02.02.2011 в 23:34.
Ответить с цитированием
  #3 (permalink)  
Старый 02.02.2011, 23:56
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от Gvozd Посмотреть сообщение
впервые слышу о таком HTML-теге, и возможность включать в него XML-документы

требую пруфлинк на документацию по тегу(а именно какому стандарту он соовтествует), и пруфлинк о поддержке его различными браузерами
Я не силен в английском, чтоб по w3.org лазать, но гугол одной из первых дает такую ссылку:

http://www.expertrating.com/coursewa...ing-HTML-8.asp


Вопрос. Если действительно нельзя вставлять куски XML в HTML, то как народ вообще делает разработку, когда много неструктурированных данных и интерфейс весь написан на JavaScript?
Ответить с цитированием
  #4 (permalink)  
Старый 03.02.2011, 00:01
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Еще ссылка:

http://www.w3schools.com/xml/xml_dont.asp

Кроме того, браузеры работают с этим тэгом, и JavaScript может гулять по его дереву, и jQuery нормально его видит. Проблема в одном - кривое дерево.

Я сейчас даже DTD блок добавил - фигушки, парсится всеравно криво.
Ответить с цитированием
  #5 (permalink)  
Старый 03.02.2011, 00:38
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

Сообщение от xintrea
Я не силен в английском, чтоб по w3.org лазать, но гугол одной из первых дает такую ссылку:

http://www.expertrating.com/coursewa...ing-HTML-8.asp
то есть лазить по устаревшим статьям, повествующих об IE года этак 2007-го, у вас хватает английского?
а почитать, о том, как реально обстоят дела, и как должны обстоять -- не хватает?

поищите внимательнее инфу об этом теге.
проблема не в том, что вы неправильно понимаете XML(пока что вы показали верное понимание его стандартов)
а в том, что вы используете какую-то ненормативную хуйню

Вот, ваш код
Будучи сохраненным как самостоятельный XML-документ он нормально парситься
Код:
<?xml version="1.0" encoding="utf-8"?>
<root>
 <version val="1"/>
 <team id="12345">
  <player id="0">
   <table direction="1">
    <line val="ABC"/>
    <line val="DEF"/>
    <line val="GHI"/>
   </table>
   <table direction="3">
    <line val="JKL"/>
    <line val="MNO"/>
    <line val="QRS"/>
   </table>
  </player>
 </team>
</root>
Вложение 672

В вашем случае, видимо содержимое тега XML все еще парсится как HTML.
ведь HTML вообще-то не имеет ни малейшего отношения к XML
он наследует SGML-стандарты

Впрочем, и XHTML, потомок XML в FF3 не хочет парсить ваш код

Последний раз редактировалось Gvozd, 30.04.2012 в 22:36.
Ответить с цитированием
  #6 (permalink)  
Старый 03.02.2011, 01:10
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от Gvozd Посмотреть сообщение
то есть лазить по устаревшим статьям, повествующих об IE года этак 2007-го, у вас хватает английского?
а почитать, о том, как реально обстоят дела, и как должны обстоять -- не хватает?
Да, я понимаю по большей части куски кода. Когда речь идет "о высоком" - не понимаю, и автопереводчики тут мало помогают.


Сообщение от Gvozd Посмотреть сообщение
поищите внимательнее инфу об этом теге.
проблема не в том, что вы неправильно понимаете XML(пока что вы показали верное понимание его стандартов)
а в том, что вы используете какую-то ненормативную хуйню
Похоже на то, что тега <xml> нетути в стандарте. Только Эксплорер поддерживает "xml-островки", созданные с помощью этого тега.

А JavaScript и jQuery работают с куском, заключенным в <xml> только потому, что эти элементы попадают в DOM-дерево. Но эти экзотичнские имена элементов неизвестны браузеру, и при рендеринге браузер их тупо игнорирует, что и должен делать каждый приличный браузер.

При анализе браузер видимо предполагает, что у каждого тега должен быть закрывающий тег. "Короткие" теги возможны только для небольшого числа элементов, типа <br/>. И если тег не принадлежит к группе "короткие" - а экзотка не принадлежит ни к какой группе - то для экзотического тега даже не проверяется его "короткость", и ищется закрывающий тег.

Если в примере вместо коротких тегов добавить закрывающие, то ситуация исправляется.

Кстати, FF спотыкается на теге <table>, ибо "знает" его и пытается его пропарсить именно как <table>.


Всвязи с вышесказанным, два вопроса.

1. Имеет ли смысл такое решение:

Используем для тегов "самодельные" имена с префиксом (например, <xml_table>, <xml_line>...), плюс снабжаем все теги закрывающими тегами.

Префикс сделает все теги неизвестными браузеру. Браузер обязан игнорировать такие неправильные теги, но в DOM они разместятся, и с ними можно работать. Да, это решение не по стандарту, но вроде как ни в одном из современных браузеров проблем возникнуть не должно, если только браузер не будет исключать из DOM-представления неизвестные ему теги.


2. Как нынче разработчики передают в JavaScript большие куски слабоструктурированной информации? XML для этого подходит идеально, но как его передавать?
Ответить с цитированием
  #7 (permalink)  
Старый 03.02.2011, 01:28
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,234

Сообщение от xintrea
Как нынче разработчики передают в JavaScript большие куски слабоструктурированной информации? XML для этого подходит идеально, но как его передавать?
вы о чем вообще?
Если я хочу передать в сгенерированной странице что-то в JS, то я его и передаю в JS, никак не задействуя разметку.
то есть я генерю JS-код, который объявляет массив
напрмиер так:
echo '<script type="text/javascript">';
echo 'var variable = ' . json_encode (array(1,'q'=>2)) . ';';
echo '</script>';


Если же я хочу передать в JS данные, используя AJAX, то использую встроенный в XHR инструмент парсинга XML, либо (я предпочитаю) тот же JSON

Честно не понимаю, как вы дошли к вашему текущему решению, и обошли стандартные нормальные решения?

Если я неправильно понял вашу конечную задачу, то опишите ее более ясно
Ответить с цитированием
  #8 (permalink)  
Старый 03.02.2011, 01:53
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от Gvozd Посмотреть сообщение
вы о чем вообще?

Если же я хочу передать в JS данные, используя AJAX, то использую встроенный в XHR инструмент парсинга XML, либо (я предпочитаю) тот же JSON

Честно не понимаю, как вы дошли к вашему текущему решению, и обошли стандартные нормальные решения?

Если я неправильно понял вашу конечную задачу, то опишите ее более ясно
Просто это первый проект, который я делаю на JavaScript и jQuery. В проекте есть много слабоструктурированных данных, которые естественным образом описываются древовидно, через XML. И в базе хранятся куски XML (по полям и таблицам БД эти данные не раскладываются, ибо сложная структура базы данных будет, и при каждом чихе ее придется менять).

На сервере вся внутренняя часть, все обсчеты и передача данных между логическими блоками делатся с помощью XML. Некоторый функционал написан на C++, используется библиотека libxml.

Идея была в том, чтобы на сервере взять кусок XML из БД (описание игрока), отправить его в "решатель", отправить этот же XML-кусок в браузер вместе с решением, и браузер технично отрисует игровую ситуацию.

Я не ожидал, что современные браузеры не могут работать с произвольным XML-деревом, что в них даже нету стандартных средств для этого, хотя DOM присутсвует в полном объеме.


В общем, видимо придется использовать JSON. Только при этом возрастет нагрузка на сервер из-за перекодирования XML<->JSON, а я этого очень не хотел.
Ответить с цитированием
  #9 (permalink)  
Старый 03.02.2011, 02:11
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от Gvozd Посмотреть сообщение
json_encode (array(1,'q'=>2))
Кстати, как там у json_encode(), не глючит в UTF-8 с русскими символами? Народ жалуется, что в PHP 5.2 и даже в 5.3 русские символы пропадают, самодельные костыли дописывают.

http://alexmuz.ru/php-json_encode/
Ответить с цитированием
  #10 (permalink)  
Старый 03.02.2011, 04:36
Аватар для NoResponse
Профессор
Отправить личное сообщение для NoResponse Посмотреть профиль Найти все сообщения от NoResponse
 
Регистрация: 17.06.2010
Сообщений: 152

гляньте в сторону XSLT, вдруг то что нужно
http://www.w3schools.com/xsl/xsl_client.asp
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск