如何删除空段元素?

Ben*_*tch 2 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();
        }
Run Code Online (Sandbox Code Playgroud)

这就是document.xml的后缀:

<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
Run Code Online (Sandbox Code Playgroud)

Mat*_*and 6

问题在这里:

        foreach (Paragraph P in D.Descendants<Paragraph>())
        {
            if (P.InnerText.Contains("{SomeText}"))
            {
                P.Remove();   //doesn't remove
            }
        }
Run Code Online (Sandbox Code Playgroud)

您是否正在尝试从集合中删除项目,而您仍在迭代它.出于某些奇怪的原因,OpenXML SDK实际上并没有在这里引发异常,它只是默默地退出foreach循环.附加调试器并单步执行将向您显示.修复很简单:

        foreach (Paragraph P in D.Descendants<Paragraph>().ToList())
        {
            if (P.InnerText.Contains("{SomeText}"))
            {
                P.Remove();   //will now remove
            }
        }
Run Code Online (Sandbox Code Playgroud)

通过添加,ToList()您将段落复制(浅拷贝)到单独的列表并迭代该列表.现在,当您删除一个段落时,它将从D.Descendants<Paragraph>()集合中删除,但不会从列表中删除,迭代将继续.

  • 这得到了所有空段落.`foreach(D.Descendants中的P段<Paragraph>().Where(x =>!x.HasChildren).ToList())`@ DesmondLost (2认同)