0

我正在使用此代码从 Word 文档中删除内容控件(发布在链接上)

 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,但我不能使用它。感谢任何建议

4

1 回答 1

1

你正在从你自己的脚下拉出地毯。

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]);
}
于 2018-06-27T15:40:19.050 回答