由于OOXML文档似乎没有遵循正确的XML规则,因此书签包含BookmarkStart
,BookmarkEnd
和中间任意数量的元素;不是一个层次结构,而是一个必须以正确的顺序遍历的单个元素流:
<w:bookmarkStart w:id="4" w:name="Author"/>
<w:r w:rsidR="009878B3"><w:rPr><w:sz w:val="28"/></w:rPr><w:t><</w:t></w:r>
<w:r w:rsidR="005E0909"><w:rPr><w:sz w:val="28"/></w:rPr><w:t xml:space="preserve"> </w:t></w:r>
<w:r w:rsidR="009878B3"><w:rPr><w:sz w:val="28"/></w:rPr><w:t>Author></w:t></w:r>
<w:bookmarkEnd w:id="4"/>
我已在相关问题中遇到此问题:https://stackoverflow.com/questions/28219201/how-to-get-the-text-of-a-bookmark-as-a-single-string
但是这个问题是,如何在不破坏任何内容的情况下完全从文档中删除书签?我是否必须从BookmarkStart
迭代兄弟姐妹,直到我到达BookmarkEnd
?是否有一些有用的API方法可以弥补无法正确使用XML的情况,从而可以删除一个Bookmark
节点?!
答案 0 :(得分:0)
您可以通过API删除BookmarkStart
,它会为您删除相应的BookmarkEnd
并保留所有内容。在C#
这样的事情应该有效:
public static void RemoveBookmark(string filename, string bookmarkName)
{
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(filename, true))
{
Body body = wordDocument.MainDocumentPart.Document.Body;
//find a matching BookmarkStart based on name
BookmarkStart start = body.Descendants<BookmarkStart>().FirstOrDefault(b => b.Name == bookmarkName);
if (start == null)
{
throw new Exception(string.Format("Bookmark {0} not found", bookmarkName));
}
//this is clever enough to remove the BookmarkStart and BookmarkEnd
start.Remove();
wordDocument.MainDocumentPart.Document.Save();
}
}