Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   [XML][DOM] Неожиданно перестал понимать! (С картинками) (https://javascript.ru/forum/events/14836-%5Bxml%5D%5Bdom%5D-neozhidanno-perestal-ponimat-s-kartinkami.html)

xintrea 03.02.2011 00:17

[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-представление такого простого примера? Как исправить?

Gvozd 03.02.2011 00:32

Цитата:

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

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

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

xintrea 03.02.2011 00:56

Цитата:

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

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

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

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


Вопрос. Если действительно нельзя вставлять куски XML в HTML, то как народ вообще делает разработку, когда много неструктурированных данных и интерфейс весь написан на JavaScript?

xintrea 03.02.2011 01:01

Еще ссылка:

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

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

Я сейчас даже DTD блок добавил - фигушки, парсится всеравно криво.

Gvozd 03.02.2011 01:38

Цитата:

Сообщение от 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 не хочет парсить ваш код

xintrea 03.02.2011 02:10

Цитата:

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

Да, я понимаю по большей части куски кода. Когда речь идет "о высоком" - не понимаю, и автопереводчики тут мало помогают.


Цитата:

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

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

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

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

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

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


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

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

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

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


2. Как нынче разработчики передают в JavaScript большие куски слабоструктурированной информации? XML для этого подходит идеально, но как его передавать?

Gvozd 03.02.2011 02:28

Цитата:

Сообщение от 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

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

Если я неправильно понял вашу конечную задачу, то опишите ее более ясно

xintrea 03.02.2011 02:53

Цитата:

Сообщение от Gvozd (Сообщение 90891)
вы о чем вообще?

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

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

Если я неправильно понял вашу конечную задачу, то опишите ее более ясно

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

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

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

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


В общем, видимо придется использовать JSON. Только при этом возрастет нагрузка на сервер из-за перекодирования XML<->JSON, а я этого очень не хотел.

xintrea 03.02.2011 03:11

Цитата:

Сообщение от Gvozd (Сообщение 90891)
json_encode (array(1,'q'=>2))

Кстати, как там у json_encode(), не глючит в UTF-8 с русскими символами? Народ жалуется, что в PHP 5.2 и даже в 5.3 русские символы пропадают, самодельные костыли дописывают.

http://alexmuz.ru/php-json_encode/

NoResponse 03.02.2011 05:36

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


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