Нельзя предполагать, что закладка начинается и заканчивается в одном абзаце. Закладки могут начинаться и заканчиваться в разных элементах и быть потомками:
bdo (§17.3.2.3); тело (§17.2.2); комментарий (§17.13.4.2); customXml (§17.5.1.6); customXml (§17.5.1.4); customXml (§17.5.1.5); customXml (§17.5.1.3); град (§22.1.2.26); del (§17.13.5.14); ден (§22.1.2.28); dir (§17.3.2.8); docPartBody (§17.12.6); е (§22.1.2.32); примечание (§17.11.2); fldSimple (§17.16.19); fName (§22.1.2.37); сноска (§17.11.10); ftr (§17.10.3); HDR (§17.10.4); гиперссылка (§17.16.22); ins (§17.13.5.18); lim (§22.1.2.52); moveFrom (§17.13.5.22); moveTo (§17.13.5.25); num (§22.1.2.75); Математика (§22.1.2.77); р (§17.3.1.22); rt (§17.3.3.24); rubyBase (§17.3.3.27); sdtContent (§17.5.2.34); sdtContent (§17.5.2.33); sdtContent (§17.5.2.35); sdtContent (§17.5.2.36); SmartTag (§17.5.1.9); sub (§22.1.2.112); sup (§22.1.2.114); Табл (§17.4.38); tc (§17.4.66); tr (§17.4.79)
https://msdn.microsoft.com/en-gb/library/documentformat.openxml.wordprocessing.bookmarkstart(v=office.15).aspx
Это означает, что вам нужно просмотреть все элементы BookmarkEnd в документе при проверке необходимого элемента BookmarkEnd.
Body body = mainPart.Document.GetFirstChild<Body>();
var bookMarkStarts = body.Descendants<BookmarkStart>();
var bookMarkEnds = body.Descendants<BookmarkEnd>();
foreach (BookmarkStart bookMarkStart in bookMarkStarts)
{
if (bookMarkStart.Name == bookmarkName)
{
//Get the id of the bookmark start to find the bookmark end
var id = bookMarkStart.Id.Value;
var bookmarkEnd = bookMarkEnds.Where(i => i.Id.Value == id).First();
var runElement = new Run(new Text("Hello World!!!"));
bookmarkEnd.Parent.InsertAfter(runElement, bookmarkEnd);
}
}
mainPart.Document.Save();
Возможно, вы захотите проверить, что Run можно добавить к родителю и добавить к другому предку или создать новый абзац.
(Мне бы хотелось добавить это как комментарий к ответу Флауэркинга, но я не могу комментировать, поэтому я изменил их код в этом ответе.)