2012-03-22 98 views
2

我正在尝试使用openxml和c#编辑word文档。我有以下文档的XML结构:使用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之间的所有文本?

+0

您是直接修改XML还是使用SDK? – 2012-03-22 19:46:06

+0

目前我正在尝试使用sdk。但是如果有一种方法可以使用纯XML,我也可以这么做 – 2012-03-22 19:53:11

+0

只需删除书签中的所有运行。 – emd 2012-04-25 16:34:50

回答

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。

祝你好运!