如何从文档中删除元素?

时间:2014-03-10 19:37:14

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

有没有办法迭代文档并删除所有<:p />元素,如果它们没有任何运行? 我试图删除段落,如果他们看起来像这样:

<w:p>
    <w:pPr>
        <w:pStyle w:val="Heading1" />
        <w:numPr>
            <w:ilvl w:val="0" />
            <w:numId w:val="0" />
        </w:numPr>
        <w:ind w:left="432" />
    </w:pPr>
</w:p>

这是我到目前为止所做的,但它只删除空的<w:p />元素。

foreach (Paragraph P in D.Descendants<Paragraph>().Where(x => !x.HasChildren).ToList()

3 个答案:

答案 0 :(得分:2)

你可以这样称呼:

foreach (Paragraph P in D.Descendants<Paragraph>()
         .Where(o=>o.Descendants<Run>().Count() ==0).ToList()

但请记住,如果您的文档中有部分,则可能会导致问题(请查看此信息以获取更多信息:http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.sectionproperties(v=office.14).aspx

答案 1 :(得分:1)

我会将xml加载到XmlDocument中,然后使用linq:

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Path\To\Xml\File.xml");

var rootNode = doc.DocumentElement;

XmlNodeList ps = rootNode.SelectNodes("//p");
for (int i = 0; i < ps.Count; i++)
{
     if (ps[i].SelectNodes("//pr").Count == 0)
     {
         rootNode.RemoveChild(ps[i]);
     }
}

该代码完全未经测试,但它确实编译。如果这对您没有任何好处,请告诉我,并查看一些Xml解析的谷歌搜索!

答案 2 :(得分:0)

我使用Linq, 这可以做得更好。

/*parent is the document body*/
parent.Descendants<Paragraph>().Where(p=>p.Descendants<Run>().Count()==0).All(p =>
{
   p.Remove();
   return true;
});

希望这会有所帮助。欢呼声。