【问题标题】:XML in Polymer template with iron-ajax - handle-as, adding XML DOM to template带有 Iron-ajax 的 Polymer 模板中的 XML - handle-as,将 XML DOM 添加到模板
【发布时间】:2017-01-09 22:31:56
【问题描述】:

我正在编写我的第一个 Polymer 应用程序,它应该允许人们阅读圣经中的希腊文本。我正在尝试读取 XML 文件以创建 DOM,然后在模板中使用它。

在<iron-ajax> 中,handle-as="xml" 有效吗?这个错误表明它可能不会:https://github.com/PolymerElements/iron-ajax/issues/53

如果我将handle-as="xml" 更改为handle-as="text",以下代码会加载一个文件,但(显然)结果只是一堆带尖括号的文本,而不是 XML DOM。改成handle-as="document"就不行了:

<template>

  <iron-ajax auto
    url="https://raw.githubusercontent.com/biblicalhumanities/greek-new-testament/master/syntax-trees/nestle1904-lowfat/xml/04-john.xml" 
    handle-as="xml"   
    last-response="{{response}}"
    >
  </iron-ajax>

  [[response]]

</template>

看到这个 Plunker:

https://plnkr.co/edit/ByMHcM7xciS2JkkF3MXI?p=preview

以上代码在content-el.html。如果您将handle-as="xml" 更改为handle-as="text",它会起作用。

问题:

  1. 我的handle-as="xml" 有问题是因为https://github.com/PolymerElements/iron-ajax/issues/53 中的错误,还是我想错了?
  2. 我假设我可以检索文本,将其解析为 XML,然后将结果放在模板中出现 [[response]] 的位置。我该怎么做?

【问题讨论】:

    标签: ajax xml polymer


    【解决方案1】:

    这里是你需要的MDN docs的相关部分:

    XMLHttpRequest.responseXML 属性是 [...] null 如果请求不成功、尚未发送,或者检索到的数据无法正确解析为 XML 或 HTML。

    [...]

    如果服务器没有将Content-Type 标头指定为"text/xml" 或"application/xml",则可以使用XMLHttpRequest.overrideMimeType() 强制XMLHttpRequest 将其解析为XML。

    在&lt;iron-ajax&gt;.response 事件的处理程序中,如果我们记录XHR 的响应(即event.detail.response.xhr.responseXML),我们会看到它是null,这表示上面MDN 文档中提到的故障条件之一。由于意外的Content-Type,可能无法正确解析响应正文。

    在您的情况下,尽管请求标头包含Accept: text/xml,但服务器仍以Content-Type 或text/plain 响应,这会导致解析器错误,从而导致responseXML 的null。

    我们可以回退到 MDN 文档指出的解决方法,使用 XMLHttpRequest.overrideMimeType() 强制将内容解析为 XML,而不管其 Content-Type 是什么。这可以在&lt;iron-ajax&gt;.request 事件处理程序中完成(在发送请求之前触发):

    <iron-ajax auto
      url="https://raw.githubusercontent.com/biblicalhumanities/greek-new-testament/master/syntax-trees/nestle1904-lowfat/xml/04-john.xml" 
      handle-as="document"
      headers='{"Accept": "text/xml"}'
      last-response="{{response}}"
      on-request="_onRequest"
      >
    </iron-ajax>
    
    // script
    _onRequest: function(e) {
      const req = e.detail.request;
      req.xhr.overrideMimeType('text/xml');
    }
    

    codepen

    另见相关post。

    【讨论】:

    • 很好的答案 - 谢谢!写得很清楚,准确地回答了我的问题。
    • @user430799 没问题 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多