您不能假设书签在一个段落中开始和结束。书签可以以不同的元素开始和结束,并且是以下元素的子元素:
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);德尔(§17.13.5.14);书房(§22.1.2.28);目录(§17.3.2.8);docPartBody (§17.12.6);e(第 22.1.2.32 节);尾注(§17.11.2);fldSimple(第 17.16.19 节);fName (§22.1.2.37); 脚注(§17.11.10);英尺(§17.10.3);人类发展报告(第 17.10.4 节);超链接(§17.16.22);插件(§17.13.5.18);林(§22.1.2.52);moveFrom(第 17.13.5.22 节);移至(第 17.13.5.25 节);数量(§22.1.2.75);oMath(第 22.1.2.77 节);p(第 17.3.1.22 节);rt(§17.3.3.24);rubyBase (§17.3.3.27); sdt 内容(第 17.5.2.34 节);sdt 内容(第 17.5.2.33 节);sdt 内容(第 17.5.2.35 节);sdt 内容(第 17.5.2.36 节);智能标签(§17.5.1.9);子(§22.1.2.112);支持(§22.1.2.114);tbl(第 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 是否可以添加到父级并添加到不同的祖先或创建新段落。
(我本来希望将此作为评论添加到 Flowerking 的答案中,但我无法发表评论,因此我在此答案中修改了他们的代码。)