【问题标题】:Render XML document (obtained through ajax call) to a new window将 XML 文档(通过 ajax 调用获得)渲染到新窗口
【发布时间】:2011-07-31 16:42:07
【问题描述】:

您好,我正在寻找一种将使用 ajax 检索的 XML 文档呈现到新浏览器窗口的方法。

我正在使用 JQuery 的 ajax() 函数将 JSON 数据发布到 MVC 控制器。控制器将 XML 作为字符串返回。

我正在使用 window.open() 在 javascript 中创建一个新窗口并通过调用设置文档内容。

newwindow.document.clear();
newwindow.document.            
newwindow.document.write(jqXHR.responseText);
newwindow.document.close();

(其中 jqXHR.responseText 是从 ajax() 调用返回的 XML。)

新窗口按预期打开,如果我在页面上查看源代码,我会看到我的 XML。但是(你知道有人来了)浏览器窗口中什么也没有出现。显然,如果我将页面源保存到磁盘并打开,输出将按预期呈现。

谁能提出解决方案? 重申一下我的主要目标是将 XML 文档(通过 ajax 调用获得)呈现到新窗口。

我还应该补充一点,我希望看到由 XSLT 转换的输出。我的 XML 有这个处理指令。 非常感谢

编辑--------------- 我使用的解决方案 ------- ------------------

感谢大家的cmets和建议。

我最终采用的解决方案是创建一个带有 target="_blank" 的表单,然后我将 JSON 作为隐藏字段写入表单,并将其发布到返回 XML(由 JSON 构造)的控制器)。当 XML 从响应中返回时,浏览器按预期标记了它。我想这不是原始问题的答案。但 Gabby 下面有一个解决方案。

【问题讨论】:

  • 您想在窗口中查看原始 XML,还是希望通过 XSLT 转换以“人性化”可读形式显示实际 XML 文档内容?
  • 我希望看到应用 XSLT 转换
  • 不是关于 XSLT 本身,而是关于 XSLT 处理器的跨浏览器调用。重新标记。
  • 我有类似的问题需要解决,并且已经发布了我在这里所做的事情。 stackoverflow.com/questions/134905/…>

标签: javascript jquery xml ajax xslt


【解决方案1】:

以下内容仅适用于 FireFox 和 Opera,但我认为值得一提..

window.open('data:text/xml,' + encodeURIComponent( jqXHR.responseText ) );

也应该与 chrome 一起使用,但它似乎对待 window.open 与通常的 URL 不同。如果你只是在 chrome 中输入生成的 url,它也可以在那里工作。


更新 这适用于所有浏览器!

问题是 javascript 能够使用 xslt 转换 xml。
但不是自动的,因此我们需要找到 XML 文件以引用 XSLT 文件并加载它。然后我们可以在 javascript 中进行转换并将生成的 html 传递到新窗口。

IE 处理事情的方式自然与其他方式不同。

$.get('xml-file-here.xml',
   function(xmlData){
                  var xml = xmlData;

                  //extract the stylesheet so we can load it manually
                  var stylesheet;
                   for (var i=0;i<xml.childNodes.length;i++){
                       if ( xml.childNodes[i].nodeName =='xml-stylesheet' )
                       {
                        stylesheet = xml.childNodes[i].data;
                       }
                   }
                  var items = stylesheet.split('=');
                  var xsltFile = items[items.length-1].replace(/"/g,'');

                  //fetch xslt manually
                  $.get( xsltFile, function(xsltData){
                      var xslt = xsltData;
                      var transformed;

                      if (! window['XSLTProcessor'])
                        {
                            // Trasformation for IE
                            transformed = xml.transformNode(xslt);
                        }
                        else
                        {
                            // Transformation for non-IE
                            var processor = new XSLTProcessor();
                            processor.importStylesheet(xslt);
                            var xmldom = processor.transformToDocument(xml);
                            var serializer = new XMLSerializer();
                            var transformed = serializer.serializeToString(xmldom.documentElement);
                        }

                      var newwindow = window.open();
                      newwindow.document.open();
                      newwindow.document.write(transformed);
                      newwindow.document.close();
                  });
   });

【讨论】:

  • 谢谢,这很有用.. 不幸的是我需要它在 IE 中工作:O。虽然我认为值得一分。,
  • @Nixon,你有多个 xslt 链接还是只有一个?
  • 谢谢!我最终做了一些不同的事情(见上面的编辑)但你的方法回答了原来的问题:)
【解决方案2】:

您必须将弹出窗口设置为Content-type: text/xml,并且使用&lt;?xml version="1.0" encoding="UTF-8"?&gt; 启动弹出窗口

【讨论】:

  • 那么您应该可以在几乎任何浏览器中阅读它。 Chrome 不会在没有插件的情况下设置 XML 样式。
【解决方案3】:

您可能会丢失一个流行词,但为什么不直接打开一个指向控制器 URL 的窗口?

【讨论】:

  • 因为我需要从当前页面发布 JSON 数据,我希望结果在新窗口中打开
【解决方案4】:

将 XML 写入文本区域。使用 CSS 设置文本区域的样式。

【讨论】:

  • 您能否详细说明您将如何设置&lt;textarea&gt; 内容的样式?
  • 不适合这种情况。我有一个相当大的 XSLT 需要应用于原始 XML。
【解决方案5】:

浏览器呈现 html。 IE 和其他一些打开带有格式的 xml 文件,但这不是浏览器的默认行为 - 所以你不应该依赖它。对我来说更好的解决方案是建议下载文件,用户将决定何时保存或打开文件。 但如果您不想下载文件,则必须从您的 xml 生成 html。在这种情况下,您应该进行一些格式化,添加 css 样式以使其更加用户友好和可读。而要实现这一点,最好的办法是使用Xsl Transformation 从 xml 生成输出 html。这将是直接从 xml 生成 html 的最优雅的方式。但是如果你也不想要这个,并且你真的不关心用户体验,你可以使用一些文本元素(p,span等)并且不直接将xml写入新窗口,而是在这个元素的文本中。这样您的 xml 将按原样显示

【讨论】:

  • XML 有一个将其链接到 XSLT 的处理指令
猜你喜欢
  • 2012-07-03
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2011-06-21
相关资源
最近更新 更多