从 WordprocessingDocument 中删除内容控件而不丢失位置

Remove Content Control form WordprocessingDocument without losing place

我正在使用此代码从 Word 文档中删除内容控件(发布于 link

 MainDocumentPart mainPart = _wordDocument.MainDocumentPart;
 List<SdtBlock> sdtList = mainPart.Document.Descendants<SdtBlock>).ToList();

  foreach (SdtBlock sdt in sdtList)
  {
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
       parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdt.Remove();
  }

一切正常,但删除操作后的文本丢失了操作前的位置。我从 openxmlpowertools 知道 SimplifyMarkup 但我不能使用它。感谢任何建议

你是在自欺欺人。

foreach (SdtBlock sdt in sdtList)
{
    sdt.Remove();
    // Now what?
}

评论点(虽然其实是在括号里)sdt是不存在的,不知道在哪的时候怎么移动到下一个呢?

解决办法是逆向工作,或者做一个列表,最后删除它们。向后工作使用一个计数,当你删除元素时它仍然存在,所以它仍然可以迭代。

foreach (int i = sdtList.Count() -1; i > 0; i--)
{
    var sdt = sdtList[i];
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
        parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdtList.Remove(sdtList[i]);
}