0

我正在用 .NET C# 编写一个 Web 服务,它接收一个对象,将其转换为 xml,应用一个 XSLT 模板,运行转换,并返回一个 MS 工作文件。

这是该函数的代码:

public static HttpResponseMessage Transform(object data)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);

    StringWriter stringWriter = new StringWriter();
    XmlWriter xmlWriter = XmlWriter.Create(stringWriter);

    var applicationDirectory = AppDomain.CurrentDomain.BaseDirectory;
    var xsltPath = applicationDirectory + @"\Reporting\Files\Template.xslt";
    var templatePath = applicationDirectory + @"\Reporting\Files\Template.docx";

    var xmlObject = new System.Xml.Serialization.XmlSerializer(data.GetType());
    MemoryStream stream;
    using (stream = new MemoryStream())
    {
        var sw = new StreamWriter(stream);
        xmlObject.Serialize(stream, data);
        stream.Position = 0;


        XslCompiledTransform transform = new XslCompiledTransform();
        transform.Load(xsltPath);

        using (XmlReader xmlReader = XmlReader.Create(stream))
        {
            transform.Transform(xmlReader, xmlWriter);

            XmlDocument newWordContent = new XmlDocument();
            newWordContent.LoadXml(stringWriter.ToString());

            var outputPath = applicationDirectory + @"\Reporting\Temp\temp.docx";

            System.IO.File.Copy(templatePath, outputPath, true);

            using (WordprocessingDocument output = WordprocessingDocument.Open(outputPath, true))
            {
                Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);

                output.MainDocumentPart.Document.Body = updatedBodyContent;

                output.MainDocumentPart.Document.Save();
            }

            response.Content = new StreamContent(new FileStream(outputPath, FileMode.Open, FileAccess.Read));
            response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            response.Content.Headers.ContentDisposition.FileName = outputPath;
        }
    }
    return response;
}

当我提出请求时,它会给我一个没有数据的 word 文件。

我在使用 (XmlReader xmlReader = XmlReader.Create(stream)) 处设置了一个断点。运行该行后,xmlReader 的值为 {None}。

我还试图避免为提高效率而创建 XML 文件(因此是 MemoryStream)。

知道为什么这不起作用吗?有没有更好的方法来实现这一点?

谢谢,格尔森

4

1 回答 1

0

如果你改变这个会发生什么:

   Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);

对此:

   Body updatedBodyContent = new Body(newWordContent.InnerXml);

或这个:

   Body updatedBodyContent = new Body(newWordContent.DocumentElement.OuterXml);

你在那里的方式会导致转换后的 XML 的外部元素被省略,我怀疑这就是你想要的(虽然不能肯定地说,因为你没有向我们展示输入 XML 或 XSLT。

于 2013-04-20T06:56:44.923 回答