我有一个关于如何将xmldoc保存为word文件的问题。我想打开word文件,使用xmldocument类对不正确的xml结构进行一些操作,然后将其重新保存回word文件。这就是我目前正在做的事情:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"E:\HelloWorld.docx", true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
var xmlDoc = new XmlDocument();
using (Stream partStream = part.GetStream())
using (XmlReader partXmlReader = XmlReader.Create(partStream))
xmlDoc.Load(partXmlReader);
//xml node manipulation here
xmlDoc.Save(@"E:\HelloWorld.docx");
}
然而,这会导致文档损坏。执行此功能的正确方法是什么?
答案 0 :(得分:2)
OpenXML文档不仅仅是一个XML文件(实际上,它是一个包含多个文件的ZIP存档,其中包含XML文件)。
您应该做的是修改WordprocessingDocument
然后保存它(在using
块结束时自动完成),而不是保存代表文档一部分的XML文件:
using (var wordDoc = WordprocessingDocument.Open(fileName, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
using (Stream partStream = mainPart.GetStream())
{
var xmlDoc = new XmlDocument();
using (XmlReader partXmlReader = XmlReader.Create(partStream))
xmlDoc.Load(partXmlReader);
//xml node manipulation here
partStream.Position = 0;
using (XmlWriter partXmlWriter = XmlWriter.Create(partStream))
xmlDoc.Save(partXmlWriter);
}
}
答案 1 :(得分:0)
如果您已成功执行了操作,则可以稍后使用wordDoc
变量上的Close()
将其保存回文件。 MSDN声明这也保存了内容。
答案 2 :(得分:0)
docx将是一个XML文件,而不是DOCX。
var xmlDoc = new XmlDocument();
...
xmlDoc.Save(@"E:\HelloWorld.docx");
您想要的是创建新的WordprocessingDocument或使用您修改的XML更新现有的WordprocessingDocument。一些事情
using (StreamWriter sw =
new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
xmlDoc.Save(sw);
}
在MSDN中查看更多示例:http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.document.aspx