我正在尝试删除包含 "{Some Text}"
的段落.下面的方法就是这样做的,但我注意到在我删除段落之后,还剩下空的段落元素。
如何删除 <w:p />
以编程方式添加元素?
下面是我最初用来删除段落的内容。
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(file, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
Document D = mainPart.Document;
foreach (Paragraph P in D.Descendants<Paragraph>())
{
if (P.InnerText.Contains("{SomeText}"))
{
P.RemoveAllChildren();
//P.Remove(); //doesn't remove
}
}
D.Save();
}
这是 document.xml 后记的样子:
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
最佳答案
这里的问题:
foreach (Paragraph P in D.Descendants<Paragraph>())
{
if (P.InnerText.Contains("{SomeText}"))
{
P.Remove(); //doesn't remove
}
}
您是否正在尝试从集合中删除一个项目,同时您仍在迭代它。由于某些奇怪的原因,OpenXML SDK 实际上并没有在这里抛出异常,它只是默默地退出了 foreach
。环形。附加调试器并逐步执行将向您展示这一点。修复很简单:
foreach (Paragraph P in D.Descendants<Paragraph>().ToList())
{
if (P.InnerText.Contains("{SomeText}"))
{
P.Remove(); //will now remove
}
}
通过添加 ToList()
您正在将段落复制(浅复制)到单独的列表并遍历该列表。现在,当您删除一个段落时,它会从 D.Descendants<Paragraph>()
中删除。收集,但不是来自您的列表,迭代将继续。
关于c# - 如何删除空段落元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22234453/