Удаление закладки с использованием xml - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь отредактировать документ Word, используя openxml и c #.У меня есть следующая структура XML для документа:

    <w:bookmarkStart w:name="HelloWorld" w:id="0" />
    <w:bookmarkStart w:name="_GoBack" w:id="1" />
    <w:r w:rsidRPr="00874DDF">
      <w:rPr>
        <w:rFonts w:ascii="Arial" w:hAnsi="Arial" />
        <w:b />
        <w:bCs />
        <w:sz w:val="28" />
        <w:szCs w:val="28" />
        <w:u w:val="single" />
      </w:rPr>
      <w:t>Hello World:</w:t>
    </w:r>
  </w:p>
  <w:p w:rsidRPr="00583A84" w:rsidR="00CB71E3" w:rsidP="00CB71E3" w:rsidRDefault="00CB71E3">
    <w:pPr>
      <w:spacing w:line="260" w:lineRule="atLeast" />
      <w:jc w:val="both" />
      <w:rPr>
        <w:rFonts w:ascii="Arial" w:hAnsi="Arial" />
        <w:color w:val="000000" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="00583A84">
      <w:rPr>
        <w:rFonts w:ascii="Arial" w:hAnsi="Arial" />
        <w:color w:val="000000" />
      </w:rPr>
      <w:t>HelloWorld.</w:t>
    </w:r>
  </w:p>
  <w:bookmarkEnd w:id="0" />
  <w:bookmarkEnd w:id="1" />

Я пытаюсь удалить весь текст в закладке на моей странице документа Word.Однако структура xml делает для меня невозможным это сделать.Это потому, что текст закладки разделен между двумя разными родительскими тегами абзаца.Как я могу удалить весь текст между закладкой начало 0 и конец закладки 0?

1 Ответ

2 голосов
/ 10 января 2013

Я создаю небольшой проект, который редактирует текст, таблицы и графики в Word на моей работе.Используя openXML, я бы заменил текст, покрытый закладкой.

Я не знаю, есть ли у вас изоляция элемента bookmarkStart, поэтому я включил и это.

Сначала код для захвата bookmarkStart:

Dictionary<String,BookmarkStart> bookMap = new Dictionary<String, BookmarkStart>(); //a dictionary so we can lookup a bookmarkStart with it's name
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("MyWordDocument.docx", true))
{
    var mainPart = wordDoc.MainDocumentPart; //get mainpart
    var bookmarks = mainPart.Document.Body.Descendants<BookmarkStart>(); //get all bookmarks
    foreach (BookmarkStart bookmarkStart in bookmarks) //save them to dictionary
    {   
        bookMap[bookmarkStart.Name] = bookmarkStart;
    }
    ReplaceInBookmark(bookmark["myBookmark"],"text to insert"); 
}

Затем заменяющая часть:

public  void ReplaceInBookmark(BookmarkStart bookmarkStart, string text)
        {
            OpenXmlElement elem = bookmarkStart.NextSibling();
            while (elem != null && !(elem is BookmarkEnd))
            {
                OpenXmlElement nextElem = elem.NextSibling();
                elem.Remove();
                elem = nextElem;
            }
            bookmarkStart.Parent.InsertAfter<Run>(new Run(new Text(text)), bookmarkStart);
        }

Это, я думаю, должно сработать.Но это копировальная паста с некоторыми небольшими изменениями кода, которую я сейчас не могу проверить, поэтому могут присутствовать ошибки / ошибки.

Если вы хотите удалить закладку и ее содержимое (не заменяяэто), вы можете попытаться отправить пустую строку или внести небольшое изменение в метод.Этот в основном удаляет все элементы, а затем вставляет новый прогон с указанным текстом.

Удачи!

...