【问题标题】:In-memory XML manipulation内存中 XML 操作
【发布时间】:2010-06-21 15:43:42
【问题描述】:

我正在尝试在 OpenXML word 文档中进行查找和替换,该文档已打开为 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有任何影响。

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

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

【问题讨论】:

    标签: xml openxml linq-to-xml memorystream file-manipulation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • “您必须使用 Save 将其写回”——您说的是哪种 Save 方法?
      猜你喜欢
      • 2011-12-04
      • 2012-08-09
      • 1970-01-01
      • 2013-11-14
      • 2011-12-20
      • 2010-11-22
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多