c# - 如何删除空段落元素?

标签 c# ms-word openxml openxml-sdk wordprocessingml

我正在尝试删除包含 "{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/

相关文章:

c# - 在不同类的控制台应用程序中使用 AutoFac 构造函数注入(inject)

c# - 是否有任何与word文档相关的元数据?

c# - 电子 token 证书的签名和验证

svn - Word/Openoffice 文档当前 SVN 版本的自动字段更新

vba - 如何拆分邮件合并并以合并字段作为名称保存文件

c# - 替换段落 Open XML 中的文本

openxml - 如何在docx4j中将文本居中

c# - 单选按钮检查验证

c# - 如何使用 .NetOffice 库添加 header

c# - OpenXml Word 脚注