0

オブジェクトを取り込み、xml に変換し、XSLT テンプレートを適用し、変換を実行し、MS 作業ファイルを返す Web サービスを .NET C# で作成しています。

関数のコードは次のとおりです。

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

リクエストすると、データなしのワードファイルが返ってきます。

using (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 に答える