0

我正在尝试在已打开的OpenXMLword 文档中进行查找和替换MemoryStream

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.

我发现了 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我真正想要的节点)没有InnerTextorValue属性或类似的东西。我看不到任何从节点获取文本或更新它们的方法。我尝试投射节点,但没有编译。

我是否朝着正确的方向前进?或者有没有更简单的方法?任何指针将不胜感激,谢谢。

4

2 回答 2

2

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

于 2010-06-21T16:59:03.403 回答
1

到第一部分(更新MemoryStream)。您应该将内存流视为只读,因为它被传递给Open方法。解析器已通读该流并在内存中构建了另一个未连接到输入流的表示。您必须使用Save.

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

于 2010-06-21T15:52:09.137 回答