Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Xml树生成Html(C#/.NET)_C#_.net_Html_Xml_Linq To Xml - Fatal编程技术网

从Xml树生成Html(C#/.NET)

从Xml树生成Html(C#/.NET),c#,.net,html,xml,linq-to-xml,C#,.net,Html,Xml,Linq To Xml,我有一个HTML文档作为Linq到XML对象树存储在内存中。考虑到HTML的特性,如何将XDocument序列化为HTML 例如,诸如之类的空标记应序列化为,而空的应序列化为 HTML输出可以从XSLT样式表中进行,并且XmlWriterSettings有一个OutputMethod属性,该属性可以设置为HTML-但是setter是内部的,供XSLT或Visual Studio使用,我似乎找不到将任意XML序列化为HTML的方法 因此,除了将XSLT仅用于HTML输出功能(即通过XSLT将文档通

我有一个HTML文档作为Linq到XML对象树存储在内存中。考虑到HTML的特性,如何将XDocument序列化为HTML

例如,诸如

之类的空标记应序列化为

,而空的
应序列化为

HTML输出可以从XSLT样式表中进行,并且
XmlWriterSettings
有一个
OutputMethod
属性,该属性可以设置为HTML-但是setter是
内部的
,供XSLT或Visual Studio使用,我似乎找不到将任意XML序列化为HTML的方法


因此,除了将XSLT仅用于HTML输出功能(即通过XSLT将文档通过一个毫无意义的XDocument->XmlReader->链运行到HTML)之外,还有没有办法将.NET XDocument序列化为HTML?

。XDocument->XmlReader->XSLT是您需要的方法

您正在寻找的是一个专门的序列化程序,它可以任意为标签名添加含义,如
br
div
,并以不同的方式呈现每个标签名。人们还希望这样的序列化程序能够在两个方向上工作,即能够读取HTML标记并生成XDocument。这样的事情不是现成的


XmlReader到XSLT对于这项工作来说似乎足够简单,最终只是一个流链。

与您一样,我真的很惊讶HTML输出方法没有公开,除了您已经确定的XSLT路径之外,我不知道还有什么其他方法。几年前,当我面临同样的问题时,我编写了一个XmlWriter包装类,如果正在处理的标记不在列表{“area”、“base”、“basefont”、“bgsound”、“br”、“col”、“embed”、“frame”、“hr”、“isindex”、“image”、“img”、“input”、“link”中,则该类会强制调用WriteEndElement在底层XmlWriter上使用WriteLendElement,“meta”,“param”,“spacer”,“wbr”}

这解决了问题,对我来说已经足够了,因为我想写的是多语言文档。我没有找到使
显示为
的方法,但除了无法验证为HTML4.01之外,这并不会导致真正的问题。我想如果您真的需要这个,并且不想使用XSLT方法,那么您必须编写自己的XmlWriter实现。

当然有

//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);
}

序列化为XHTML,问题已解决。您想序列化为旧HTML有什么特别的原因吗?另外,
应该等同于
..@Matt:也许浏览器在接受应用程序/xhtml+xml时可以正确理解,否则就不正确了。IE不会也不理解application/xhtml+xml。anthony说的话直指问题的核心:xml(实际上:只是一个有效的树)非常适合处理,但HTTP支持很差,所以我宁愿在与浏览器通信时不使用任何形式的xml。不仅仅是浏览器;使用xml意味着不同的内容类型,这会影响SEO、缓存和代理,所以我宁愿完全避免这些潜在的陷阱,而使用普通的旧html。我仍然坚持我最初所说的。我坚信XHTML是HTML的发展方向。HTML是一团乱(这个问题的必要性就证明了这一点)。做正确的事情,XHTML,正确的内容类型,让浏览器担心他们的实现失败。无论如何,这是你能做的最好的了。从我的经验来看,IE只是在总体上被打破了。哦,原则上我喜欢XHTML(见鬼,在我曾经写的博客的短暂尝试中),但我认为它是一种开发工具,而不是一种现实的部署选项。我不喜欢IE6,但我宁愿IE6用户看到一个不完美但功能强大的布局,而不是一个“另存为”对话框。令人恼火的是,该对话框中的某个地方显然支持使用html规则进行序列化—毕竟,它是从Xslt工作的,并且有一个
内部
属性。此外,使用XSLT的html输出还向文档的头部添加了一个(通常是无用且不正确的)元标记。我会把这个问题再留待一段时间,但如果没有人能想出更好的解决办法,恐怕你是对的。