使用xml删除书签

时间:2012-03-22 19:43:20

标签: c# openxml

我正在尝试使用openxml和c#编辑单词doc。我有doc的以下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" />

我正在尝试删除单词doc页面中书签中的所有文本。然而,xml结构使我无法这样做。这是因为书签文本在两个不同的段落父标签之间分开。如何删除书签开始0和书签结束0之间的所有文本?

1 个答案:

答案 0 :(得分:2)

我正在构建一个小项目,在我的工作中编辑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);
        }

我认为这应该可以胜任。 但它是一些复制品,对某些代码进行了一些小编辑,我现在无法自由测试,因此可能存在错误/错误。

如果要删除书签及其内容(不替换它),您可以尝试发送空字符串或对方法进行少量更改。 这个基本上删除了所有元素,然后插入一个带有指定文本的新Run。

祝你好运!