我正在使用此代码(发布在link上)从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,但是我不能使用它。感谢任何建议
答案 0 :(得分: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]);
}