我有一个XML文档(在.net C#web应用程序中),我希望以简单的形式显示(类似于IE)。我需要它与浏览器无关(或尽可能多)并具有一致的显示。
我尝试将xml文档推送为“text / xml”,这是不一致的,并且在某些浏览器中不起作用。
http://sources.redhat.com/ml/xsl-list/2002-02/msg00831.html 这里的链接提供了一种使用样式表将XML转换为HTML / XHTML的好方法。 但是提供的样式表没有用。
第一:这是最好的方法吗?有更好的解决方案吗? 第二:如果没有,有谁知道我在哪里可以找到XSLT?
编辑(澄清):我引用的XSLT将XML转换为XML文件的Internet Explorer样式显示。
提前致谢! :)
答案 0 :(得分:3)
我认为我最好的方法(就我的情况而言)是编写2个简单的C#方法,从服务器端的XML生成HTML。这有助于减少对浏览器显示XML的依赖(Opera is Crazy!)
(这个例子使用非常简单的格式,这对我的情况很好。 我在IE的XML显示上松散地建模了它。 供其他人参考,以下是方法:
/// <summary>
/// Does a simple convert to display an Xml document in HTML.
/// </summary>
/// <param name="xmlString"></param>
private static string ConvertXmlToHtml(string xmlString)
{
StringBuilder html = new StringBuilder();
html.AppendLine("<HTML>");
html.AppendLine("<HEAD><TITLE>Xml Document</TITLE></HEAD>");
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlString);
html.AppendLine(ConvertXmlElementToHTML(1, doc.DocumentElement));
html.AppendLine("</HTML>");
return html.ToString();
}
/// <summary>
/// Converts an XML element (and all of its children) to HTML.
/// This is a recursive method.
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
private static string ConvertXmlElementToHTML(int level, XmlNode element)
{
int padding = level; // padding (cm == level).
StringBuilder returnHTML = new StringBuilder();
if (element is XmlElement)
{
// Formatting for symbols to simplify code below.
string close_bracket = "<SPAN style=\"color: blue\">></SPAN>";
string close_bracket_no_children = "<SPAN style=\"color: blue\"> /></SPAN>";
string open_bracket = "<SPAN style=\"color: blue\"><</SPAN>";
string open_bracket_end_el = "<SPAN style=\"color: blue\"></</SPAN>";
string el_name = "<SPAN style=\"color: brown\">" + element.Name + "</SPAN>";
string quote = "<SPAN style=\"color: blue\">\"</SPAN>";
string equals_sign = "<SPAN style=\"color: blue\">=</SPAN>";
// Open Element.
returnHTML.AppendLine("<DIV style=\"margin-left: " + padding + "cm\">" + open_bracket + el_name);
// Print element attributes.
foreach(XmlAttribute att in element.Attributes)
{
returnHTML.AppendLine(" <SPAN style=\"color: brown\">" + att.Name + "</SPAN>" + equals_sign + quote + "<SPAN style=\"color: black; text-weight: bold\">" + att.Value + "</SPAN>" + quote);
}
// If no children, we end the element here with a '/ >'
// otherwise, we close the element and start to write children '>'
if (element.ChildNodes.Count == 0)
{
returnHTML.AppendLine(close_bracket_no_children + "</DIV>");
}
else
{
returnHTML.AppendLine(close_bracket + "</DIV>");
}
// Print Children. (Recursive call). Note location is IMPORTANT: we need child elements
// to print after the element is opened and before the element is closed.
foreach (XmlNode child in element.ChildNodes)
{
returnHTML.AppendLine(ConvertXmlElementToHTML(level + 1, child));
}
// If we have printed child elements, we need to print a closing element tag.
if (element.ChildNodes.Count > 0)
{
returnHTML.AppendLine("<DIV style=\"margin-left: " + padding + "cm\">" + open_bracket_end_el + el_name + close_bracket + "</DIV>");
}
}
// Return a string of HTML that will display elements at this level and below (child nodes).
return returnHTML.ToString();
}
答案 1 :(得分:1)
您尝试使用的样式表仅适用于现代浏览器,不适用于任何版本的IE。在现代浏览器中做这些事情是微不足道的,但在IE中你需要通过javascript和.NET调用MSXML,以便对其他更现代的浏览器(Firefox,Safari,Chrome,Opera,K-Meleon,Konqueror)进行本机转换。 ,主显节,羊群......你明白了。这是IE导致的问题的一部分,因为没有实现XHTML,基本上,这就是你想要做的和其他浏览器所做的事情。
如果你还没有使用我使用的javascript解决这个问题,我会在早上回来查看。
答案 2 :(得分:0)