Создать вывод System.Xml.XmlDocument.OuterXml (), действительный в HTML - PullRequest
0 голосов
/ 30 ноября 2009

System.Xml.XmlDocument.OuterXml () сгенерирует (например)

<list id="myBooks">
  <book id="123" name="XML for muppets" />
  <book id="456" name="HTML for fools" />
</list>

Если вы хотите встроить этот XML-файл в HTML-страницу, он будет хорошо работать в IE (поскольку острова данных XML являются расширением стандартов HTML)

Однако для Firefox вам нужно загрузить этот неизвестный HTML-тег, содержащий xml, в DOMParser , используя что-то вроде

var list = document.getElementById("myBooks");
var doc = new DOMParser().parseFromString(list.outerHTML);

Однако, поскольку <tag /> не равен == <tag></tag> в HTML, Firefox увидит list.outerHTML как

<list>
  <book id="123" name="XML for muppets">
     <book id="456" name="HTML for fools">
     </book>
  </book>
</list>

Итак, как мне заставить XmlDocument.OuterXml () выводить xml полностью закрывающие теги, а не сокращенные?

EDIT - Добавлен пример для иллюстрации

<html><body>
<xml id="myBooks">
<list>
  <book id="123" name="XML for muppets" />
  <book id="456" name="HTML for fools" />
</list>
</xml>
<script>
var oXml = document.getElementById("myBooks");
alert(oXml.innerHTML);
</script>
</body></html>

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009

Я в замешательстве.С чего вы взяли, что Firefox не сможет интерпретировать самозакрывающиеся теги XML?XHTML, который поддерживается всеми основными браузерами, включая Firefox, позволяет вам использовать такие самозакрывающиеся теги везде, где у вас нет контента.Почему остров данных XML может быть другим?

Кроме того, вы можете захотеть использовать XmlTextWriter для записи в StringWriter или что-то в этом роде.Вы можете настроить XmlTextWriter с XmlWriterSettings , который задает XmlOutputMethod Html, который может обеспечить более HTML-подобный вывод.

ОБНОВЛЕНИЕ К сожалению, я только что проверил это, и у свойства OutputMethod есть внутренний установщик.Но из любопытства я использовал отражение, чтобы установить его, и он действительно изменил вывод XML так, что самозакрывающиеся теги были превращены в отдельные закрывающие теги.Код ниже.

var stream = new System.IO.StringWriter();
var xmldoc = new System.Xml.XmlDocument();
xmldoc.LoadXml("<root><child><grandchild /></child><child /></root>");

var settings = new System.Xml.XmlWriterSettings();
var propInfo = settings.GetType().GetProperty("OutputMethod");
propInfo.SetValue(settings, System.Xml.XmlOutputMethod.Html, null);
var writer = System.Xml.XmlWriter.Create(stream, settings);

xmldoc.Save(writer);

stream.ToString().Dump();
1 голос
/ 30 ноября 2009

Это немного клудж, но добавляет пробел в любые пустые узлы, поэтому изменится

<book id="123" name="XML for muppets" />

в

<book id="123" name="XML for muppets"> </book>

Будем рады появлению на DailyWTF!

addSpaceToEmptyNodes(xmlDoc.FirstChild);

private void addSpaceToEmptyNodes(XmlNode node)
    {
        if (node.HasChildNodes)
        {
            foreach (XmlNode child in node.ChildNodes)
                addSpaceToEmptyNodes(child);
        }
        else         
            node.InnerText = " ";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...