2010-06-21 60 views
0

我正在尝试查找并替换OpenXML word文档,我已将其打开到MemoryStream内存中的XML操作

using (WordprocessingDocument _document = WordprocessingDocument.Open(_ms, true)) 
{ 
    var placeHolder = _document.MainDocumentPart.Document 
          .Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>() 
          .Where(node => node.InnerText.Contains("***PlaceHolderText***")) 
          .FirstOrDefault(); 

    placeHolder.InnerText.Replace("***PlaceHolderText***", "hello world!"); 
} 

这是行不通的。我不知道为什么,但以这种方式处理文档似乎并不对MemoryStream有任何影响。

我发现this blog by Eric White它做了类似的事情,但我还是不太明白。他使用的XDocument,所以我有类似以下内容:

XDocument doc = _document.MainDocumentPart.GetXDocument(); // this is an extension method 
var textNodes = doc.DescendantNodes().Where(n => n.NodeType == XmlNodeType.Text); 

此找到合适的节点我的文档中,但问题是,现在我不能工作,如何更改文本。我以这种方式结束的System.Xml.Linq.XNodes(而不是我真正想要的DocumentFormat.OpenXml.Wordprocessing.Text节点)没有InnerTextValue属性或类似的东西。我看不到任何方式从节点获取文本,或更新它们。我试着施放节点但没有编译。

我是否会朝着正确的方向前进?还是有更简单的方法?任何指针将非常感激,谢谢。

回答

1

我终于得到了这个工作。取第一个代码片段,最后一行应为placeHolder.Text而不是placeHolder.InnerText。不敢相信我浪费了4个小时! :(

1

到第一部分(更新MemoryStream)。 您应该将内存流视为只读,因为它将传递给Open方法。解析器已经读取了流,并构建了另一个与输入流不相关的内存表示。您必须使用Save将其写回。

至于操纵XNode的文本内容,您正在寻找XText.Value

+0

“你将不得不使用保存将它写回” - 其中保存方法你在说什么? – 2010-12-28 08:17:49

+0

像这样的http://msdn.microsoft.com/en-us/library/cc838778.aspx – dkackman 2011-01-02 02:18:03