2015-01-29 3 views
0

Поскольку документы 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>&lt;</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&gt;</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

Если у вас есть контроль над исходными документами, вы можете использовать элементы управления содержимым вместо закладок. Элементы управления контентом намного лучше с точки зрения XML. – JasonPlutext

+0

@JasonPlutext Я никогда не слышал об этом. Я бы приветствовал ответ, основываясь на этом, поскольку мы контролируем документы. –

+0

См. Обычно https://msdn.microsoft.com/en-us/library/bb157891.aspx. Вам понадобится элемент управления расширенным текстовым контентом. Они могут быть вложенными. Добавьте один, используя меню разработчика в Word. Для openxml-sdk см. Https://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.sdtblock(v=office.14).aspx (обратите внимание, что существует другой класс в зависимости от того, управление содержимым aka sdt является блочным уровнем, встроенным, окружает строку таблицы или ячейку таблицы) – JasonPlutext

ответ

0

Вы можете просто удалить BookmarkStart через API, и он удалит соответствующий 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(); 
    } 
} 
+0

Это очень полезно знать, но на самом деле это целая закладка, включая содержимое, которое я хочу удалить, а не просто «unbookmark», –

Смежные вопросы