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

xintrea

Новичок
Здравствуйте!


Сейчас столкнулся с ситуацией, в которой понял, что я ничего не понимаю в 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-представление такого простого примера? Как исправить?
 

magic

lancer
Ошибки в схеме. Каждый браузер по-своему пытается их исправить.
Проверь любым валидатором.
 

xintrea

Новичок
Ошибки в схеме. Каждый браузер по-своему пытается их исправить.
Проверь любым валидатором.
Тут схемы никакой нет, только XML. Но я даже написал DTD блок, с которым этот XML состыковывается и валидация всего XML-куска проходит без ошибок (XML-валидатор редактора oXygen 5.1). И даже с DTD всёравно парсится неправильно.

HTML-валидаторы не помогают, так как затыкаются на теге <xml>. Его видимо действительно нет в стандартах, хотя про него рассказывается тут:

http://www.expertrating.com/courseware/XMLCourse/XML-Embedding-HTML-8.asp

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


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

newARTix

Новичок
xintrea
html это разве не схема? В HTML нет самозакрывающегося тега version и т.д.
То что у тебя < xml вставлен в другой тег означает что у тебя уже некорректный xml-документ.

ЗЫ Сходил по ссылкам. Там ведь черным по белому написано:
"Here are some technologies you should try to avoid when using XML."
"XML Data Islands only works with Internet Explorer browsers."
Что ты хочешь от Оперы и ФФ?
 

xintrea

Новичок
xintrea
html это разве не схема? В HTML нет самозакрывающегося тега version и т.д.
То что у тебя < xml вставлен в другой тег означает что у тебя уже некорректный xml-документ.
Мне нужен какой-нибудь способ передать в JavaScript произвольное XML-дерево, ведь реализация DOM работает с любыми тегами и атрибутами.

Есть ли такой способ? Желательно, чтоб без лишнего конвертирования, ибо на сревере слабоструктурированные данные хранятся большими XML-кусками в базе. Вот эти куски и нужно уметь передавать в браузер, чтоб JavaScript мог с ними работать.

Как?
 

newARTix

Новичок
сделай корректный XML-документ (а не изврат с html), и он будет работать.
http://ru.wikipedia.org/wiki/XML
(подскажу: XML документ всегда начинается с <?xml )
и будет в Фаерфоксе нормально отображаться.
 

xintrea

Новичок
сделай корректный XML-документ (а не изврат с html), и он будет работать.
http://ru.wikipedia.org/wiki/XML
(подскажу: XML документ всегда начинается с <?xml )
и будет в Фаерфоксе нормально отображаться.
А дальше, как его подключить к HTML?

Ведь страница сайта на HTML сделана, и JavaScript к HTML инклюдится.

Кому нужен отдельный XML с данными, если с ним работать нельзя, только "показывать"?
 

newARTix

Новичок
xintrea
оо... да вам батенька в соседний кабинет :) Увы, прямо отобразить XML в HTML нельзя. Его надо преобразовать в нормальную HTML-верстку. Как? Ну тут уже масса способов, хоть XSL, хоть тупо яваскриптом парсить и генерить HTML, или на стороне сервера тем же PHP. Проще всего видимо XSL.
 

xintrea

Новичок
xintrea
оо... да вам батенька в соседний кабинет :) Увы, прямо отобразить XML в HTML нельзя. Его надо преобразовать в нормальную HTML-верстку. Как? Ну тут уже масса способов, хоть XSL, хоть тупо яваскриптом парсить и генерить HTML, или на стороне сервера тем же PHP. Проще всего видимо XSL.
Нет, это не решение.

Я накопал более простую вещь. XML загоняется в строку (просто экранирутся кавычки). Эта строка преобразуется в DOM с помощью JavaScript:

Код:
text="<a><b><c id=\"12345\">Hello</c></b></a>";

if (window.DOMParser)
  {
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(text,"text/xml");
  }
else // Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(text); 
  }
Код отсюда взят: http://www.w3schools.com/Dom/dom_parser.asp
 

Adelf

Administrator
Команда форума
открой для себя JSON :)
Оно уж совсем хорошо из PHP обьектов, массивов в js-представление преобразовывает.
 
Сверху