Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用xml删除书签_C#_Openxml - Fatal编程技术网

C# 使用xml删除书签

C# 使用xml删除书签,c#,openxml,C#,Openxml,我正在尝试使用openxml和c#编辑word文档。我有以下文档的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

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

我正在构建一个小项目,在我的工作中用Word编辑文本、表格和图形。 使用openXML,这就是我如何替换书签覆盖的文本的方法

我不知道您是否包含了
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"); 
}
Dictionary bookMap=newdictionary()//一本字典,这样我们就可以从它的名字开始查找书签
使用(WordprocessingDocument wordDoc=WordprocessingDocument.Open(“MyWordDocument.docx”,true))
{
var mainPart=wordDoc.MainDocumentPart;//获取mainPart
var bookmarks=mainPart.Document.Body.subjections();//获取所有书签
foreach(BookmarkStart bookmarks)//将它们保存到字典中
{   
bookMap[bookmarkStart.Name]=bookmarkStart;
}
替换书签(书签[“myBookmark”],“要插入的文本”);
}
然后更换零件:

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);
        }
public void ReplaceInBookmark(BookmarkStart BookmarkStart,字符串文本)
{
OpenXmlElement elem=bookmarkStart.NextSibling();
while(elem!=null&&!(elem是BookmarkEnd))
{
openxmlement nextlem=elem.NextSibling();
elem.Remove();
elem=nextElem;
}
bookmarkStart.Parent.InsertAfter(新运行(新文本),bookmarkStart);
}
我认为,这应该能起到作用。 但这是一个复制粘贴,对一些代码进行了一些小的编辑,我现在无权测试,所以可能会出现bug/错误

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


祝你好运

您是直接修改XML还是使用SDK?目前我正在尝试使用SDK。但是,如果有一种方法可以使用纯xml来实现,我会同意,只要删除书签中的所有运行。