Я только что понял это 10 минут назад, так что простите за хакерскую природу кода.
Сначала я написал вспомогательную рекурсивную вспомогательную функцию, чтобы найти все закладки:
private static Dictionary<string, BookmarkEnd> FindBookmarks(OpenXmlElement documentPart, Dictionary<string, BookmarkEnd> results = null, Dictionary<string, string> unmatched = null )
{
results = results ?? new Dictionary<string, BookmarkEnd>();
unmatched = unmatched ?? new Dictionary<string,string>();
foreach (var child in documentPart.Elements())
{
if (child is BookmarkStart)
{
var bStart = child as BookmarkStart;
unmatched.Add(bStart.Id, bStart.Name);
}
if (child is BookmarkEnd)
{
var bEnd = child as BookmarkEnd;
foreach (var orphanName in unmatched)
{
if (bEnd.Id == orphanName.Key)
results.Add(orphanName.Value, bEnd);
}
}
FindBookmarks(child, results, unmatched);
}
return results;
}
, которая возвращает мне словарь, который я могу использовать, чтобы разделить мой список замены и добавить текст послезакладка:
var bookMarks = FindBookmarks(doc.MainDocumentPart.Document);
foreach( var end in bookMarks )
{
var textElement = new Text("asdfasdf");
var runElement = new Run(textElement);
end.Value.InsertAfterSelf(runElement);
}
Из того, что я могу сказать, вставить и заменить закладки выглядит сложнее.Когда я использовал InsertAt вместо InsertIntoSelf, я получил: «Несоставные элементы не имеют дочерних элементов».YMMV