Создание HTML из дерева Xml (C # /. NET) - PullRequest
2 голосов
/ 25 августа 2009

У меня есть HTML-документ, хранящийся в памяти в виде дерева объектов Linq-to-XML. Как я могу сериализовать XDocument как HTML, учитывая особенности HTML?

Например, пустые теги, такие как <br/>, должны быть сериализованы как <br>, тогда как пустые <div/> должны быть сериализованы как <div></div>.

Вывод HTML возможен из таблицы стилей XSLT, а XmlWriterSettings имеет свойство OutputMethod, которое может быть установлено в HTML - но для установки используется internal, для использования XSLT или Visual Studio, и я не могу похоже, что можно найти способ сериализации произвольного XML как HTML.

Итак, если не использовать XSLT исключительно для возможности вывода HTML (т. Е. Делать что-то вроде запуска документа через бессмысленную в противном случае цепочку XDocument-> XmlReader-> через XSLT в HTML), существует ли способ сериализации a. NET XDocument для HTML?

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Как и вы, я очень удивлен, что метод вывода HTML не раскрывается, и я не знаю, как его обойти, кроме того, что вы уже определили маршрут XSLT. Когда я столкнулся с той же проблемой пару лет назад, я написал класс-обертку XmlWriter, который заставлял вызовы WriteEndElement использовать WriteFullEndElement для базового XmlWriter, если обрабатываемый тег отсутствовал в списке {"area", "base" , "basefont", "bgsound", "br", "col", "embed", "frame", "hr", "isindex", "image", "img", "input", "link", " meta "," param "," spacer "," wbr "}.

Это решило проблему

и было достаточно для меня, поскольку я хотел написать документы полиглота. Я не нашел способ сделать
похожим на
, но кроме того, что я не смог проверить его как HTML 4.01, это не вызывает особых проблем. Я предполагаю, что если вам это действительно нужно и вы не хотите использовать метод XSLT, вам придется написать собственную реализацию XmlWriter.
2 голосов
/ 25 августа 2009

Нет . XDocument-> XmlReader-> XSLT - это подход, который вам нужен.

Вам нужен специализированный сериализатор, который произвольно добавляет значение к именам тегов, таким как br и div, и отображает каждое из них по-разному. Можно также ожидать, что такой сериализатор будет работать в обоих направлениях, и я смогу читать суп HTML-тегов и генерировать XDocument. Такой вещи не существует "из коробки".

XmlReader для XSLT кажется достаточно простым для работы, в конечном итоге это просто цепочка потоков.

1 голос
/ 15 июля 2012

Конечно, есть!

//XDocument document; string filename;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
typeof(XmlWriterSettings).GetField("outputMethod", BindingFlags.NonPublic|BindingFlags.Instance).SetValue(settings, XmlOutputMethod.Html);
using(XmlWriter xw = XmlWriter.Create(filename, settings))
{
    document.Save(xw);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...