В JavaScript, как сериализатор может быть частью DOM в XHTML? - PullRequest
5 голосов
/ 28 сентября 2011

Я хотел бы сериализовать часть DOM в XHTML (действительный XML).Давайте предположим, что у меня есть только один элемент внутри <body>, и что это элемент, который я хочу сериализовать:

<div>
    <hr>
    <img src="/foo.png">
</div>

С этим document.innerHTML дает мне почти то, что я хочу, за исключением того, что возвращает HTML,не XHTML (то есть <hr> и <img> не будут должным образом закрыты).Поскольку innerHTML не помогает, как я могу сериализовать часть DOM в XHTML?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Я не уверен, что использование другого языка (поверх движка JavaScript) является опцией.Если это поможет, это будет способ XQuery (XQIB):

<script type="application/xquery">
  serialize(b:dom()//div)
</script>

Например, на следующей странице сериализованный XHTML записывается в виде текста на странице вместотег script, после тега div:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>   
    <title>Serializing part of the DOM</title>
    <meta charset="UTF-8"/>
    <script type="text/javascript" src="mxqueryjs/mxqueryjs.nocache.js"></script>
  </head>
  <body>
    <div>
      <hr>
      <img src="/foo.png">
    </div>
    <script type="application/xquery">
      serialize(b:dom()//div)
    </script>
  </body>
</html>

HTML DOM сопоставлен с моделью данных XQuery (модель данных поверх XML).b: dom () возвращает узел документа страницы, и // div перемещается ко всем тегам div потомков.Затем функция сериализации сериализует это в строку.

Однако это будет работать для IE9 + (не 6+) и последних версий Chrome, Firefox, Safari, Opera.

0 голосов
/ 07 февраля 2012

Sarissa , кросс-браузерная библиотека совместимости Javascript имеет реализацию XMLSerializer для браузеров, у которых ее нет:

http://dev.abiss.gr/sarissa/jsdoc/symbols/XMLSerializer.htm

У них также есть пример того, как его использовать , который просто:

var xmlString = new XMLSerializer().serializeToString(someXmlDomNode);

По их словам, поддержка браузера для их библиотеки хорошая:

Поддерживаются следующие браузеры Mozilla - Firefox и семейство, Internet Explorer с MSXML3.0 и выше, Konqueror (наверняка KDE 3.3+), Safari и Opera.

0 голосов
/ 28 сентября 2011

это не проверенный код, но я бы рекурсивно сканировал дочерние элементы родительского элемента и собирал XHTML следующим образом:

var parent;
var parse = function(el) {
  var res = "";
  for(var i=0; i < el.childNodes.length; i++) {
    var child = el.childNodes[i];
    res += "<"+child.tagName;
    // scan through attributes
    for(var k=0; k < child.attributes.length; k++) {
      var attr = child.attributes[k];
      res += " "+attr.name+"='"+attr.value+"'";
    }
    res += ">";
    res += parse(child);
    res += "</"+child.tagName+">";
  }
  return res;
}
var xhtml = parse(parent);
...