0

OpenXML開いた単語ドキュメントを検索して置換しようとしています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

私はこのブログをEricWhiteが見つけましたが、それは似たようなことをしていますが、それでも完全には理解できません。彼はを使用している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ようにしてしまうもの(私が本当に欲しいノードの代わりに)には、 orプロパティなどDocumentFormat.OpenXml.Wordprocessing.Textがありません。ノードからテキストを取得したり、更新したりする方法がわかりません。ノードをキャストしようとしましたが、コンパイルされませんでした。InnerTextValue

私も正しい方向に進んでいますか?または、もっと簡単な方法はありますか?どんなポインタでも大歓迎です、ありがとう。

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 に答える