C# 使用xml删除书签
我正在尝试使用openxml和c#编辑word文档。我有以下文档的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
<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来实现,我会同意,只要删除书签中的所有运行。