将scala.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和play框架创建一个API服务器。在我的一个API调用中,我上传了一个JSON,在服务器上进行了一些干预之后,我发回了一个XML。然后,这个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文件的前端方法。实际上有一个非常简单的方法,我现在正在使用。稍后我会在自己的答案中发布这个方法。谢谢你的帮助。非常感谢。