提问人:jonhurono 提问时间:5/24/2022 最后编辑:Reza Heidarijonhurono 更新时间:6/2/2022 访问量:387
将 XmlWriter 转换为 Stream / char / byte []
Convert XmlWriter to Stream / char / byte []
问:
我有一个 asp.net/C#/Blazor 环境,其中按钮生成具有特定类的 XML。使用XML Writer,我可以制作文件,甚至可以保存/下载它,但它会转到服务器端(它必须在客户端下载,请不要争论它)。
我知道 Blazor 实现了一些即时下载 (https://learn.microsoft.com/en-us/aspnet/core/blazor/file-downloads?view=aspnetcore-6.0),它非常适合空白/新文件,但问题是,我不知道如何使用 XML 编写器方法“传递”或转换我以前生成的 XML,因为 Blazor 方法只允许 Stream、char 或字节数组下载。
当我尝试转换它时,错误
我的一些代码是:
protected async Task CreateXmlFile(int correlativo,string idDocumento, string siglaDocumento, List<DocumentoXML> documentos = null, List<SignersXML> signersXMLs = null,
List<ContentXMLComplemento> complementos = null,
List<SignersXMLComplemento> signersComplemento = null)
{
_xmlWriterSettings = new XmlWriterSettings
{
Indent = true,
Encoding = new UTF8Encoding(false)
};
string fullPath= "";
XmlWriter writer;
XmlSerializer serializer;
var documentoIngresoRaiz = new DocumentoIngresoRaiz
{
Content_XML = new List<ContentXML>
{
new ContentXML
{
sve_XML = new List<sveXML>
{
new sveXML
{
Documento_XML = documentos
}
}
}
},
Signers_XML = signersXMLs
};
fullPath = $"{mainPath}Ingreso-{correlativo}.xml";
var fileName = $"Ingreso-{correlativo}.xml";
writer = XmlWriter.Create(fullPath, _xmlWriterSettings);
serializer = new XmlSerializer(typeof(DocumentoIngresoRaiz));
serializer.Serialize(writer, documentoIngresoRaiz);
writer.Close();
//I've been trying with these 3 Blazor method lines, to send my xml as stream
var fileStream = new MemoryStream(writer);
using var streamRef = new DotNetStreamReference(stream: fileStream);
await JS.InvokeVoidAsync("downloadFileFromStream", fileName, streamRef);
}
错误 CS1503:参数 1:无法从“System.Xml.XmlWriter”转换为“byte[]”
我一直在寻找 StackOverflow 和 Internet,但没有成功。 我找到了一些类似的帖子(我想下载我在用户系统上使用 XmlWriter.Create() 创建的 C# XML 文件)(如何从 XMLWriter 获取 Stream?),但它们无法解决我的问题。欢迎任何帮助或提示。先谢谢你!
答:
0赞
jonhurono
6/2/2022
#1
由于无法将已经生成的XML文件转换为字节/流/字符数组,我发现解决方案是:
将此 XML 文件保存在服务器端 然后立即通过JavaScript代码(粘贴在下面)将其下载到本地计算机,传递fileURL(文件在服务器上的位置)和fileName(文件的名称)
await JS.InvokeVoidAsync("triggerFileDownload", fileName, fileURL);
function triggerFileDownload(fileName, url) {
const anchorElement = document.createElement('a');
anchorElement.href = url;
anchorElement.download = fileName ?? '';
anchorElement.click();
anchorElement.remove();
}
评论
MemoryStream
XmlWriter.Create(stream, _xmlWriterSettings);