将scala.xml节点转换为虚拟文件,准备下载它
我正在使用scala和play框架创建一个API服务器。在我的一个API调用中,我上传了一个JSON,在服务器上进行了一些干预之后,我发回了一个XML。然后,这个XML应该作为文本文件下载,我认为如果我直接在后端开始下载,而不是在前端创建文件,这是最简单的 我已经使用将scala.xml节点转换为虚拟文件,准备下载它,xml,scala,playframework,java.nio.file,Xml,Scala,Playframework,Java.nio.file,我正在使用scala和play框架创建一个API服务器。在我的一个API调用中,我上传了一个JSON,在服务器上进行了一些干预之后,我发回了一个XML。然后,这个XML应该作为文本文件下载,我认为如果我直接在后端开始下载,而不是在前端创建文件,这是最简单的 我已经使用scala.XML包成功地创建了我想要的XML,现在我有了一个节点对象,当打印出来时,它看起来非常像我正在寻找的XML Scala的Scala.xml.xml对象有一个方法,恰当地称为save,它允许我用xml创建一个文件。我可以用
scala.XML
包成功地创建了我想要的XML,现在我有了一个节点
对象,当打印出来时,它看起来非常像我正在寻找的XML
Scala的Scala.xml.xml
对象有一个方法,恰当地称为save
,它允许我用xml创建一个文件。我可以用它来创建我的XML,但这意味着我必须将它保存在硬盘上,这是它自己的蠕虫病毒罐。但是在如何将文件保存在RAM中,我有点不知所措。有人能帮我吗
编辑1:
为了澄清,在前端,我使用axios调用此API。在我用户的计算机上,应该有一个下载对话框打开,询问我的用户在哪里保存文件,该文件可能被称为
foo.xml
。据我所知,我需要将XML转换为文件流。我只需将其保存在硬盘上并在其上使用java.nio
就可以轻松做到这一点,但我希望有一种方法可以避免硬盘上的写入操作,只需将其读回文件流,然后将其删除即可。据我所知,您希望为您的客户提供一个XML,即。,发送内容类型为application/xml的HTTP响应
如果这是您想要做的,那么只需将scala.xml.NodeSeq作为参数传递给相应的操作中的Ok
调用即可。如中所述,播放框架将在响应中自动设置正确的内容类型。无需事先将XML保存到文件中,因为您可以直接将XML作为响应发送
例如:
class MyController extends Controller {
def processXml = Action { implicit request =>
// Process XML
val myXml: NodeSeq = getXml()
Ok(myXml)
}
}
所以,对于每个有类似问题的人来说。在前端更改数据并强制下载似乎要容易得多
我按照马蒂亚斯·A·埃克哈特的建议返回了数据。在前端,我在这个小函数中输入数据:
function download(filename, text) {
const element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
此解决方案可在以下位置找到:
感谢Matěj Pokorný你好,Matthias,谢谢你的回答。我不确定这是否真的有帮助,我还需要一个小时才能尝试,但我试图在我最初问题的编辑1中澄清我的要求。如果您方便的话,请看一下。@some奇怪314这可能是一个问题。你想做什么?在我看来,您似乎希望为用户提供包含XML内容的HTTP响应。我在节点
对象中有一个XML,应该作为下载提供给用户。这不仅仅是发送回XML而不是JSON。它是关于发回一个扩展名为.xml
的文本文件,用户可以将其保存在自己选择的位置。@some奇怪314是的,这就是我的想法,但这与发送具有适当内容类型的HTTP响应有何不同?通常,浏览器会可视化XML,因此不会打开弹出窗口,但用户仍然可以将XML保存为文件。好的,问题解决了。我按照您的建议做了,并通过Ok(xmlNode)
直接返回了值。我确实在axios中有它来做我喜欢做的事情,我搜索了创建.xml文件的前端方法。实际上有一个非常简单的方法,我现在正在使用。稍后我会在自己的答案中发布这个方法。谢谢你的帮助。非常感谢。