我正在.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)。
知道为什么这不起作用?有没有更好的方法来实现这个目标?
谢谢, 格
答案 0 :(得分:0)
如果你改变了这一点会发生什么:
Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);
到此:
Body updatedBodyContent = new Body(newWordContent.InnerXml);
或者这个:
Body updatedBodyContent = new Body(newWordContent.DocumentElement.OuterXml);
你拥有它的方式将导致转换的XML的外部元素被省略,我怀疑这是你想要的(虽然不能肯定地说,因为你没有向我们展示输入XML或XSLT