03.02.2011, 00:17
|
Аспирант
|
|
Регистрация: 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-представление такого простого примера? Как исправить?
|
|
03.02.2011, 00:32
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от xintrea
|
это кусок JavaScript-проекта, в котором используется jQuery, и некоторые слабоструктурированные данные вставляются в код страницы в виде блока <xml>...</xml>.
|
впервые слышу о таком HTML-теге, и возможность включать в него XML-документы
требую пруфлинк на документацию по тегу(а именно какому стандарту он соовтествует), и пруфлинк о поддержке его различными браузерами
Последний раз редактировалось Gvozd, 03.02.2011 в 00:34.
|
|
03.02.2011, 00:56
|
Аспирант
|
|
Регистрация: 02.01.2011
Сообщений: 56
|
|
Сообщение от Gvozd
|
впервые слышу о таком HTML-теге, и возможность включать в него XML-документы
требую пруфлинк на документацию по тегу(а именно какому стандарту он соовтествует), и пруфлинк о поддержке его различными браузерами
|
Я не силен в английском, чтоб по w3.org лазать, но гугол одной из первых дает такую ссылку:
http://www.expertrating.com/coursewa...ing-HTML-8.asp
Вопрос. Если действительно нельзя вставлять куски XML в HTML, то как народ вообще делает разработку, когда много неструктурированных данных и интерфейс весь написан на JavaScript?
|
|
03.02.2011, 01:01
|
Аспирант
|
|
Регистрация: 02.01.2011
Сообщений: 56
|
|
Еще ссылка:
http://www.w3schools.com/xml/xml_dont.asp
Кроме того, браузеры работают с этим тэгом, и JavaScript может гулять по его дереву, и jQuery нормально его видит. Проблема в одном - кривое дерево.
Я сейчас даже DTD блок добавил - фигушки, парсится всеравно криво.
|
|
03.02.2011, 01:38
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
то есть лазить по устаревшим статьям, повествующих об 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 в 23:36.
|
|
03.02.2011, 02:10
|
Аспирант
|
|
Регистрация: 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 для этого подходит идеально, но как его передавать?
|
|
03.02.2011, 02:28
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от 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
Честно не понимаю, как вы дошли к вашему текущему решению, и обошли стандартные нормальные решения?
Если я неправильно понял вашу конечную задачу, то опишите ее более ясно
|
|
03.02.2011, 02:53
|
Аспирант
|
|
Регистрация: 02.01.2011
Сообщений: 56
|
|
Сообщение от Gvozd
|
вы о чем вообще?
Если же я хочу передать в JS данные, используя AJAX, то использую встроенный в XHR инструмент парсинга XML, либо (я предпочитаю) тот же JSON
Честно не понимаю, как вы дошли к вашему текущему решению, и обошли стандартные нормальные решения?
Если я неправильно понял вашу конечную задачу, то опишите ее более ясно
|
Просто это первый проект, который я делаю на JavaScript и jQuery. В проекте есть много слабоструктурированных данных, которые естественным образом описываются древовидно, через XML. И в базе хранятся куски XML (по полям и таблицам БД эти данные не раскладываются, ибо сложная структура базы данных будет, и при каждом чихе ее придется менять).
На сервере вся внутренняя часть, все обсчеты и передача данных между логическими блоками делатся с помощью XML. Некоторый функционал написан на C++, используется библиотека libxml.
Идея была в том, чтобы на сервере взять кусок XML из БД (описание игрока), отправить его в "решатель", отправить этот же XML-кусок в браузер вместе с решением, и браузер технично отрисует игровую ситуацию.
Я не ожидал, что современные браузеры не могут работать с произвольным XML-деревом, что в них даже нету стандартных средств для этого, хотя DOM присутсвует в полном объеме.
В общем, видимо придется использовать JSON. Только при этом возрастет нагрузка на сервер из-за перекодирования XML<->JSON, а я этого очень не хотел.
|
|
03.02.2011, 03:11
|
Аспирант
|
|
Регистрация: 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/
|
|
|
|