将 XmlWriter 转换为 Stream / char / byte []

Convert XmlWriter to Stream / char / byte []

提问人:jonhurono 提问时间:5/24/2022 最后编辑:Reza Heidarijonhurono 更新时间:6/2/2022 访问量:387

问:

我有一个 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?),但它们无法解决我的问题。欢迎任何帮助或提示。先谢谢你!

C# asp.net XML Blazor 客户端

评论

0赞 dbc 5/24/2022
你不能直接序列化到一个通孔吗?MemoryStreamXmlWriter.Create(stream, _xmlWriterSettings);
0赞 jonhurono 5/24/2022
@dbc是的,我已经尝试过了,但出现了同样的错误:“无法从'System.Xml.XmlWriter'转换为'char[]':/
0赞 dbc 5/24/2022
编译错误发生在哪一行?

答:

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();
 }